home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_AI / AI_053 / SED / SRC / SED_568.GFA (.txt) < prev   
GFA-BASIC Atari  |  1998-03-14  |  439KB  |  18,143 lines

  1. ' *** ERGO_TP vß.70r (25.11/23:32): XRef-Informationen eintragen
  2. $c+
  3. RESERVE MAX(MIN(600*1024,FRE(0)/2),200*1024)
  4. '
  5. '
  6. '
  7. '             Anton Stepper                    Claus Brod
  8. '             Südring 7            &           Blumenstraße 13
  9. '             97828 Marktheidenfeld            71134 Aidlingen
  10. '             09391/8697                       07034-63683
  11. '
  12. '             E-Mail:                          E-Mail:
  13. '             Anton Stepper                    Claus Brod @ BB
  14. '                                              claus_brod@bbn.hp.com
  15. '
  16. '
  17. ' SED darf innerhalb des Mausnetzes als GFA-Quelltext
  18. ' und als Compilat innerhalb dieses Archivs kopiert werden.
  19. ' Mit dieser Kopiererlaubnis sind keine weiteren Rechte verbunden,
  20. ' alle Verwertungsrechte bleiben also bei den Autoren. Insbesondere
  21. ' ist es nicht erlaubt, SED oder Teile davon auf anderem Wege als
  22. ' über das Mausnetz oder auf der 'Kleisterscheibe', der Diskette
  23. ' zum Buch 'Scheibenkleister' zu verbreiten. Auf irgendwelchen
  24. ' PD-Disketten hat der SED also nichts zu suchen, und schon gar
  25. ' nicht darf er ohne die Genehmigung der Autoren und der Firma Maxon
  26. ' kommerziell vertrieben werden.
  27. '
  28. ' Damit darf sich also jeder aus der Maus BB die aktuellen SED-
  29. ' Versionen holen und in anderen Mäusen ablegen. Letzteres ist,
  30. ' wenn neue Versionen in die Maus BB gelangen, auch erwünscht,
  31. ' damit andere freiwillige SED-Entwickler einfacher an die
  32. ' aktuelle Version kommen können.
  33. '
  34. ' Nur die von den Autoren freigegebenen Versionen des SED dürfen
  35. ' in Umlauf kommen. Wenn also Änderungen am SED vorgenommen werden,
  36. ' müssen sie zuerst den Autoren vorgelegt werden, um sie "offiziell"
  37. ' einzubauen. Es spricht aber nichts dagegen, zwischen zwei
  38. ' "offiziellen" Versionen Patch-Vorschläge und Verbesserungen
  39. ' in Form von diff-Listings zu verbreiten, solange darin ausdrücklich
  40. ' auf den vorläufigen Charakter hingewiesen wird.
  41. '
  42. ' Die Autoren werden zugesandte Änderungen in den aktuellen Quelltext
  43. ' zu integrieren versuchen. Es kann natürlich vorkommen, daß sich
  44. ' Änderungsvorschläge nicht miteinander vertragen oder aus anderen
  45. ' Gründen nicht sinnvoll sind. Die letzte Entscheidung über die
  46. ' Integration behalten wir uns daher vor. Ebenso beanspruchen wir
  47. ' das Recht, im Laufe dieses Prozesses verbesserte SED-Versionen mit
  48. ' der aktuellen Version der 'Kleisterscheibe' im Rahmen von Updates
  49. ' weiterzugeben.
  50. '
  51. ' Dies ist ein Quelltext für GFA3.5/3.6.
  52. '
  53. ver$="SED_568"
  54. '
  55. '
  56. '
  57. '
  58. ' last update:  26.11.93        CB
  59. ' 1994-12-26 RS: Modifikationen von Rainer Seitel @ KA
  60. '                Mindestens folgende Fehler gibt's noch:
  61. '                In der Resource beim Menüeintrag »Dateienliste« die Punkte weg.
  62. '                In der Resource bei Dateiinfo Uhrzeit-Feld auf 6 Ziffern. Sonst werden beim Schreiben des Dateiinfo die Sekunden immer auf 0 gesetzt.
  63. '                Bei mehr als 32767 Clustern klappt »Dateienliste« nicht.
  64. ' 1995-02-05 RS: Cluster zurück geht auch wenn dieser hintendran liegt.
  65. '                Größter Clusterindex ist jetzt cpd%+1.
  66. '                SED kommt eventuell ganz mit einer FAT zurecht.
  67. '                Partitionen löschen gibt defekte Cluster nicht mehr frei.
  68. '                2 Vorschläge vom Ende übernommen:
  69. '                In Dialogboxen können []@{}\ eingegeben werden.
  70. '                Bei FAT-Graph Anzahl der Cluster hinter dem Dateinamen.
  71. ' 1995-04-04 RS: SED sollte jetzt wirklich mit mehr als $FFFE Sektoren zurechkommen.
  72. '                FAT prüfen ordentlicher.
  73. '                In disc_save do_list auskommentiert.
  74. ' 1996-05-26 CB: Fix in media_all und media eingebaut (Dank an Steffen Engel!).
  75. '                Ob das wohl den Absturz beim Wechsel in den Plattenmodus
  76. '                behebt? Sieht so aus...
  77. ' ---------------------------------------------------------------------------
  78. var_init                ! Variablen
  79. init_ram                ! Speicher holen
  80. init_do                 ! SED_.INF laden
  81. default_bootsec         !
  82. chk_ofls                ! Überwachung offener Dateien
  83. rsc_init                ! RSC-Datei laden und Variablen
  84. mc_init                 ! SCSI-Interface INIT
  85. boot_sec                ! aktuellen Bootsektor lesen
  86. warnungen               ! Warnungen ausgeben
  87. base_look               ! Applikation?
  88. endless_loop            ! ....
  89. ' --------------------------------------------------------------
  90. PROCEDURE var_init    ! Variablen INIT
  91.   .| Glob. Var.: max_err%,max_part%,multiple%,max_diff%,sec_max%,fdcinf_max%
  92.   .|     fdrive%,base$,a$,repflag%,n$,l$,esc$,cr$,gm$,ext_magic%,fp%,xt%,yt%
  93.   .|     tz%,status%,seite%,target%,geraet%,block%,dec%,z%,prg_adr%,lern%,ch%
  94.   .|     cvisible%,menu_pointer%,txt_zeile%,txt_links%,last%,ch2%,txt_blkon%
  95.   .|     block_marke%,d.isk%,f.ile%,h.ard%,r.am%,f.dc%,mode%,hex!,itar%,hard%
  96.   .|     buf_size%,bps%,l_end%,spd%,top%,file_open%,l_eline%,old_cpos%,old_p%
  97.   .|     txt_spalte%,buf_end%,beg_ascii%,minad%,maxad%,format_time_out%,drive%
  98.   .|     sed_pfad$,pfad$,rsc$,ver$,p_help$,sed_inf$,sed_inf2$,dum$,hlp_str$
  99.   .|     fg$,wa$,sys_base%,romstart%,rom_version%,ram_max%,scsi_errmax%
  100.   .| Felder    : p_flag%(),p_id$(),p_start%(),p_size%(),po_start%(),po_size%()
  101.   .|     p_block%(),scsi_err$(),hd_typ%(),hd_typ$(),dma%(),pfad$(),scr%()
  102.   .|     mem%(),par%(),fe%(),wi%(),men_ienable%(),err_fld$(),flos$(),frei%()
  103.   .|     bt$(),bz$(),t_a%(),whdl&(),wnr%(),wz%(),wc%(),tx%(),ty%(),l_end%()
  104.   .|     w_titel%(),inl_tab%(),inl_dat%(),byt_sec%(),sek%(),s%(),im$(),rate%()
  105.   .|     se_inf$(),fdc_info$()
  106.   .| Ruft auf  : set_aktpar,get_pfad
  107.   .| Aufruf in : HAUPTPROGRAMM-1,
  108.   LOCAL i&
  109.   '
  110.   max_err%=200          ! Maximale Fehler- oder Mitteilungen
  111.   max_part%=12*5
  112.   '
  113.   ' globale Felder für allerlei
  114.   '     für HD-Teil
  115.   DIM p_flag%(max_part%),p_id$(max_part%),p_start%(max_part%),p_size%(max_part%)
  116.   DIM po_start%(max_part%),po_size%(max_part%),p_block%(max_part%)
  117.   DIM scsi_err$(10),hd_typ%(7),hd_typ$(6),dma%(32)
  118.   '     für Window+Menü
  119.   DIM pfad$(50),scr%(5),mem%(5),par%(8),fe%(15,4),wi%(15,4),men_ienable%(70)
  120.   DIM err_fld$(max_err%),flos$(1,10),frei%(14,2),bt$(5),bz$(5)
  121.   ' für RSC
  122.   DIM t_a%(50)
  123.   '     fürs 2. Fenster
  124.   DIM whdl&(15),wnr%(15),wz%(15),wc%(15),tx%(15),ty%(15),l_end%(15),w_titel%(1)
  125.   '  für Stringverwaltung mittels INLINE
  126.   DIM inl_tab%(5),inl_dat%(5)
  127.   '
  128.   '     für Floppy Routinen
  129.   CLR multiple%                 ! Für Read/Write Sector
  130.   max_diff%=30                  ! Für Analyse (Diff: Trackpos. - Headerpos.)
  131.   sec_max%=25                   ! für Analyse
  132.   fdcinf_max%=100
  133.   DIM byt_sec%(4),sek%(sec_max%,20),s%(2),im$(10),rate%(6),se_inf$(sec_max%)
  134.   DIM fdc_info$(fdcinf_max%)
  135.   '
  136.   FOR i&=7 TO 10
  137.     byt_sec%(i&-7)=2^i&         ! FDC (WD 1772) Sektorlängen 128,256,512,1024
  138.   NEXT i&
  139.   CLR fdrive%                   ! für Floppy A
  140.   '
  141.   rate%(1)=2
  142.   rate%(2)=3
  143.   rate%(3)=0
  144.   rate%(4)=1                    ! Stepratenfeld
  145.   '
  146.   rate%(5)=3                    ! A = 3 ms
  147.   rate%(6)=0                    ! B = 6 ms
  148.   '
  149.   '     Aufbau von sec%(x,y):
  150.   '                x=Sektornummer in physikalischer Folge
  151.   '                  y=0 Sektornummer
  152.   '                   =1 Beginn Vorspann    (relativ zu Buffer)
  153.   '                   =2 Beginn Header           "        "
  154.   '                   =3 Beginn Gap              "        "
  155.   '                   =4   "    Data             "        "
  156.   '                   =5 Ende   Data             "        "
  157.   '                   =6
  158.   '                   =7 Kein Sektor 3=.... 2=.... 1=Rnf. / 0= ok
  159.   '                   =8 abgebrochen 1=ja  / 0=nein
  160.   '                   =9 Sektorlänge
  161.   '                   =10
  162.   '                   =11  Kopie von Header
  163.   '                   =12        '
  164.   '                   =13        '
  165.   '                   =14        '
  166.   '                 x= Sektor + 1   1,2 = Tracknachspann !
  167.   '
  168.   ' ----------------------- sonstige Variablen -----------------------
  169.   base$=CHAR{BASEPAGE+129}      ! Kommandozeile übernehmen
  170.   IF LEN(base$)=0
  171.     ~SHEL_READ(a$,base$)        ! a$=PRG$
  172.     IF LEN(base$)>=2
  173.       base$=MID$(base$,2)
  174.     ELSE
  175.       CLR base$
  176.     ENDIF
  177.   ENDIF
  178.   IF INSTR(base$,CHR$(13))>0
  179.     base$=LEFT$(base$,INSTR(base$,CHR$(13))-1)
  180.   ENDIF
  181.   base$=base$+CHR$(0)
  182.   ' --------------------
  183.   repflag%=PEEK(&H484)
  184.   '
  185.   n$=STRING$(10,"0")    ! für alle formatierten Zahlenausgaben
  186.   l$=SPACE$(10)
  187.   esc$=""              ! ESC
  188.   cr$=CHR$(13)+CHR$(10)
  189.   gm$="GEMDOS-Fehler"
  190.   ext_magic%=&H43424844 ! ROOT-Erkennung der zusätzlichen Partitionen
  191.   '
  192.   CLR fp%,xt%,yt%,tz%,status%,seite%,target%,geraet%,block%,dec%,z%
  193.   CLR prg_adr%,lern%,ch%,cvisible%,menu_pointer%,txt_zeile%,txt_links%,last%
  194.   CLR ch2%,txt_blkon%,block_marke%
  195.   '
  196.   '
  197.   ' LAST%- 1= ...      2= ...       3=FIND_FILES    4=FAT_GRAF  5=FILE_REPAIR
  198.   '        6=DIR_PATH  7=SHOW_ROOT  8=INFO_BUTTONS  9=INFO_FKEY
  199.   '       10=HARDSEAR 11=DIR_SORT
  200.   '
  201.   '
  202.   d.isk%=1              ! die verschiedenen Modi
  203.   f.ile%=2
  204.   h.ard%=3
  205.   r.am%=4
  206.   f.dc%=5
  207.   mode%=d.isk%          ! Sektormodus
  208.   hex!=TRUE             ! In Hex-Teil
  209.   '
  210.   itar%=15              ! Target des Initiators(TT)
  211.   hard%=2               ! Default ist Vortex-Platte
  212.   buf_size%=16384
  213.   bps%=512              ! Default-Wert für Sektorgröße
  214.   l_end%=bps%           ! List_end ...
  215.   set_aktpar(0)
  216.   spd%=1
  217.   top%=1
  218.   '
  219.   file_open%=-1         ! Flag für kein File geöffnet
  220.   l_eline%=-1           ! Last-Edit-Line
  221.   old_cpos%=-1          ! Cursor
  222.   old_p%=-1
  223.   txt_spalte%=1
  224.   buf_end%=-1           ! Block
  225.   '
  226.   ARRAYFILL men_ienable%(),1
  227.   scr%(0)=0             ! für BITBLIT
  228.   '
  229.   beg_ascii%=49
  230.   minad%=0              ! 1. Zeichen im Font
  231.   maxad%=&HFF           ! letztes ...
  232.   ' -----------------
  233.   hd_typ$(1)="ATARI"
  234.   hd_typ$(2)="VORTEX"
  235.   hd_typ$(3)="SCSI"
  236.   hd_typ$(4)="c't"
  237.   hd_typ$(5)=""
  238.   '
  239.   format_time_out%=20*60
  240.   '
  241.   IF ROL&(GEMDOS(48) AND &HFFFF,8)<&H15 THEN
  242.     dos_max_sektors%=32767  !größte Anzahl Sektoren vor GEMDOS 0.15
  243.   ELSE
  244.     dos_max_sektors%=65535  !größte Anzahl Sektoren ab GEMDOS 0.15 (TOS 1.04)
  245.   ENDIF
  246.   ' -----------------
  247.   drive%=GEMDOS(25) AND 255     ! Aktuelles Laufwerk
  248.   get_pfad                      ! Pfad von Gemdos holen
  249.   sed_pfad$=pfad$               ! zum Auffinden von "SED_xxx"
  250.   FOR i&=1 TO DIM?(pfad$())-1
  251.     pfad$(i&)=sed_pfad$         ! Pfade initialisieren
  252.   NEXT i&
  253.   '
  254.   rsc$=pfad$+ver$+".RSC"        ! RSC -Datei
  255.   p_help$=pfad$+ver$+".HLP"     ! HELP-Datei
  256.   sed_inf$=pfad$+ver$+".INF"
  257.   sed_inf2$=pfad$+ver$+".INX"
  258.   dum$="SED_DUM.DUM"            ! Datei, zum Prüfen des Schreibschutzes
  259.   hlp_str$="   "+ver$+" (c) 1987-1992   by  Anton Stepper  &  Claus Brod"
  260.   '
  261.   fg$="?VDX."                   ! Für Anzeige in FAT-GRAPH
  262.   ' ? = verklebt, V = Verwaltung, X = Leiche, D = defekt, . = frei
  263.   '
  264.   wa$="Weiter|Abbruch"
  265.   '
  266.   sys_base%=LPEEK(&H4F2)        ! Zeiger auf TOS-Vorspann
  267.   romstart%=LPEEK(sys_base%+8)
  268.   rom_version%=DPEEK(sys_base%+2)
  269.   ram_max%=&H400000
  270.   '
  271.   ' ----------------------------------------
  272.   RESTORE scsi_err      ! Harddiskfehler SCSI
  273.   CLR scsi_errmax%
  274.   DO
  275.     READ scsi_err$(scsi_errmax%)
  276.     EXIT IF scsi_err$(scsi_errmax%)="*"
  277.     INC scsi_errmax%
  278.   LOOP
  279.   '
  280. scsi_err:
  281.   DATA OK,Fehler beim Selektieren,Defaultfehler (Chaos),ungültige Phase
  282.   DATA BSY-Signal verloren,Busfehler (SCSI-DMA-Übertragung),Fehler bei DMA-Transfer
  283.   DATA SCSI-Bus blockiert,Timeout,"*"
  284.   '
  285.   ' ----------------------------------------
  286.   RESTORE anal_errors           ! Fehler in ANALYSE
  287.   FOR i&=1 TO 10
  288.     READ im$(i&)
  289.   NEXT i&
  290.   '
  291. anal_errors:
  292.   DATA Gap Header-Datamark,Datamark not found,Sector length,Tracknr.,Double Sector
  293.   DATA Gap Sector-Header,Wrong Side,Header/Sector,Sectornr.,Differenz
  294.   ' -------------------
  295. RETURN
  296. PROCEDURE rsc_init    ! RSC initialisieren
  297.   .| Glob. Var.: rsc$,pfad$,ver$,appl_id%,graf_handle%,z.b%,z.h%,dum%,hbox%
  298.   .|     planes%,scr_handle%,dx%,dy%,dw%,dh%,scr_mem%,rsc_mem%,max.text%
  299.   .|     font_soll$,fontsx%,help_size%,hard%,target%
  300.   .| Felder    : mem%(),fe%(),out$()
  301.   .| Ruft auf  : alrt,v_opnvwk,vq_extnd,vst_point,rsc_variable,set_rsc
  302.   .|     check_vor,init_font,set_help,set_hard,do_exit,wind_init,redraw_desk
  303.   .|     menu_2,menu_init
  304.   .| Aufruf in : HAUPTPROGRAMM-1,
  305.   LOCAL a$,i&,x%,y%
  306.   '
  307.   IF EXIST(rsc$)=FALSE
  308.     a$=pfad$+ver$+".RSC"
  309.     IF EXIST(a$)
  310.       rsc$=a$
  311.     ENDIF
  312.   ENDIF
  313.   '
  314.   DO WHILE EXIST(rsc$)=FALSE
  315.     a$=RIGHT$(rsc$,LEN(rsc$)-RINSTR(rsc$,"\"))
  316.     FILESELECT #"Suche '"+ver$+".RSC'",pfad$+"*.RSC",a$,rsc$
  317.   LOOP UNTIL LEN(rsc$)=0
  318.   '
  319.   IF LEN(rsc$)=0
  320.     EDIT
  321.   ELSE
  322.     IF RSRC_LOAD(rsc$)=0
  323.       ~@alrt(3,"RSC-Ladefehler",1,"Abbruch")
  324.       EDIT
  325.     ENDIF
  326.     ' --------------------------
  327.     appl_id%=APPL_INIT()
  328.     graf_handle%=GRAF_HANDLE(z.b%,z.h%,dum%,hbox%)
  329.     v_opnvwk
  330.     planes%=@vq_extnd(scr_handle%,1)
  331.     ~@vst_point(scr_handle%,10)
  332.     ' --------------------------
  333.     ~WIND_GET(0,4,dx%,dy%,dw%,dh%)      ! Innenmaße des DESKTOP
  334.     rsc_variable
  335.     ' --------------------------
  336.     scr_mem%=(planes%*rsc_mem%) DIV 8
  337.     mem%(0)=MALLOC(scr_mem%)            ! BITBLIT-Felder füllen
  338.     mem%(4)=0
  339.     mem%(5)=planes%
  340.     ' --------------------------
  341.     x%=32768/dw%
  342.     y%=32768/dh%
  343.     '
  344.     fe%(1,1)=fe%(1,1)/x%
  345.     fe%(1,2)=MAX(dy%,fe%(1,2)/y%)
  346.     fe%(1,3)=fe%(1,3)/x%
  347.     fe%(1,4)=fe%(1,4)/y%
  348.     '
  349.     fe%(0,1)=fe%(0,1)/x%
  350.     fe%(0,2)=MAX(dy%,fe%(0,2)/y%)
  351.     fe%(0,3)=fe%(0,3)/x%
  352.     fe%(0,4)=fe%(0,4)/y%
  353.     ' --------------------------
  354.     set_rsc                             ! RSC-Einstellungen setzen
  355.     DIM out$(max.text%)                 ! Zeilen für Textfenster
  356.     check_vor                           ! RSC-Voreinstellungen holen
  357.     init_font(font_soll$,fontsx%)       ! FONT einstellen?
  358.     IF help_size%>0
  359.       set_help                          ! HELP-Dialog initialisieren
  360.     ENDIF
  361.     hard%=@set_hard(target%)            ! Plattentyp
  362.     ' ---------------------------
  363.     IF dw%<640
  364.       ~@alrt(4,ver$+"|In dieser Auflösung|kann ich nicht arbeiten!",1,"Abbruch")
  365.       do_exit
  366.     ENDIF
  367.     wind_init
  368.     redraw_desk(0)
  369.     menu_2
  370.     menu_init
  371.   ENDIF
  372. RETURN
  373. PROCEDURE wind_init   ! Windows öffnen
  374.   .| Glob. Var.: wind%,whdl&,wx&,wy&,wb&,wh&
  375.   .| Felder    : whdl&()
  376.   .| Ruft auf  : wind_calc,wind_open,wind_pos,wind_size
  377.   .| Aufruf in : rsc_init-1,desktop_back-1,
  378.   wind_calc(0)          ! Window berechnen
  379.   wind%=1
  380.   wind_open(wind%)      ! Fenster öffnen
  381.   wind_pos(wind%)
  382.   whdl&=whdl&(wind%)
  383.   ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&)
  384.   '
  385.   CLR wind%
  386.   wind_open(wind%)
  387.   whdl&=whdl&(wind%)
  388.   ~WIND_GET(whdl&,5,wx&,wy&,wb&,wh&)
  389.   wind_size(wind%,wx&,wy&,wb&,wh&)
  390. RETURN
  391. PROCEDURE mc_init     ! SCSI-Interface INIT
  392.   .| Glob. Var.: tt%,tt!,scsi%,format_time_out%,locksley%
  393.   .| Ruft auf  : search_cookie
  394.   .| Aufruf in : HAUPTPROGRAMM-1,
  395.   LOCAL frb%,pmmu%
  396.   tt%=@search_cookie("_MCH",0)  ! Ersatz für  TT?
  397.   tt!=(tt% DIV 65536)>2
  398.   frb%=@search_cookie("_FRB",0)
  399.   pmmu%=@search_cookie("PMMU",0)
  400.   '
  401.   ~C:scsi%(L:0,L:tt%,L:frb%,L:pmmu%,L:format_time_out%)
  402.   ~C:locksley%(L:0,L:tt%,L:frb%,L:pmmu%)
  403. RETURN
  404. PROCEDURE set_rsc     ! RSC voreinstellen
  405.   .| Glob. Var.: hdcm1&,hdcm10&,hd.comm%,hdflag0&,v.oreinst%,dechex&,dec%
  406.   .|     feed&,f.eed%,slider&,s.lider%,dial2pos&,dial.pos%,sammeln&,s.ammeln%
  407.   .|     txtsavm&,t.xtsavm%,sperrtxt&,sperr_txt%,feedcode&,f.eedcode%
  408.   .|     vorcurrt&,cursor_rate%,tabanz&,tabs%,maxtext&,max.text%,targ.mask%
  409.   .|     tmask1&,tmask8&,tghdtyp&,desk.top%,k1&,inf_ma$,a.lert%,alrti1&
  410.   .|     alrti5&
  411.   .| Felder    : dma%(),hd_typ$(),hd_typ%()
  412.   .| Ruft auf  : put_char,cross_rsc,put_wert,trans_gimage
  413.   .| Aufruf in : rsc_init-1,opt_konfig-1,
  414.   LOCAL a&,i&
  415.   '           Einstellungen die der SED speichert, im RSC setzen
  416.   '
  417.   FOR i&=hdcm1& TO hdcm10&      ! HARD-COMMAND löschen
  418.     put_char(hd.comm%,i&,"")
  419.   NEXT i&
  420.   FOR i&=0 TO 4
  421.     cross_rsc(hd.comm%,hdflag0&+i&,0)
  422.   NEXT i&
  423.   ' --------------------------
  424.   cross_rsc(v.oreinst%,dechex&,dec%)
  425.   cross_rsc(v.oreinst%,feed&,f.eed%)
  426.   cross_rsc(v.oreinst%,slider&,s.lider%)
  427.   cross_rsc(v.oreinst%,dial2pos&,dial.pos%)
  428.   cross_rsc(v.oreinst%,sammeln&,s.ammeln%)
  429.   cross_rsc(v.oreinst%,txtsavm&,t.xtsavm%)
  430.   cross_rsc(v.oreinst%,sperrtxt&,sperr_txt%)
  431.   '
  432.   put_char(v.oreinst%,feedcode&,HEX$(f.eedcode%,2))
  433.   put_wert(v.oreinst%,vorcurrt&,cursor_rate%,4)
  434.   put_wert(v.oreinst%,tabanz&,tabs%,2)
  435.   put_wert(v.oreinst%,maxtext&,max.text%,5)
  436.   '
  437.   FOR i&=0 TO 15
  438.     cross_rsc(targ.mask%,tmask1&+i&,dma%(i&))
  439.   NEXT i&
  440.   FOR i&=16 TO 31
  441.     cross_rsc(targ.mask%,tmask8&+i&-16,dma%(i&))
  442.   NEXT i&
  443.   FOR i&=0 TO 7
  444.     put_char(targ.mask%,tghdtyp&+i&,hd_typ$(hd_typ%(i&)))
  445.   NEXT i&
  446.   FOR i&=0 TO 13                ! 14 kleine Boxen beschriften
  447.     put_char(desk.top%,k1&+i&,MID$(inf_ma$,i&*5+1,5))
  448.   NEXT i&
  449.   a&=OB_Y(a.lert%,alrti1&)              ! y-Pos ICON 2-5  = y-Pos ICON 1 !
  450.   FOR i&=alrti1& TO alrti5&
  451.     trans_gimage(a.lert%,i&)            ! ICONs konvertieren
  452.     OB_Y(a.lert%,i&)=a&                 ! y-Pos
  453.   NEXT i&
  454. RETURN
  455. PROCEDURE base_look   ! Kommandozeile?
  456.   .| Glob. Var.: ver_base%,f1$,f2$,base$
  457.   .| Felder    : pfad$()
  458.   .| Ruft auf  : menu_1,do_cursor_anz,file_compare,do_file_open
  459.   .| Aufruf in : HAUPTPROGRAMM-1,
  460.   LOCAL a&
  461.   CLR ver_base%,f1$,f2$
  462.   '
  463.   IF LEN(base$)>0
  464.     a&=INSTR(base$," ")
  465.     IF a&>0
  466.       f2$=RIGHT$(base$,LEN(base$)-a&)
  467.       f2$=LEFT$(f2$,INSTR(base$,CHR$(0))-1)
  468.       f1$=LEFT$(base$,a&-1)
  469.       WHILE RIGHT$(f2$)=CHR$(0)
  470.         f2$=LEFT$(f2$,LEN(f2$)-1)
  471.       WEND
  472.     ELSE
  473.       f1$=LEFT$(base$,INSTR(base$,CHR$(0))-1)
  474.     ENDIF
  475.     IF EXIST(f1$)=TRUE OR RIGHT$(f1$)="\"
  476.       menu_1            ! FILE on
  477.       do_cursor_anz(0)
  478.       IF LEN(f2$)>0
  479.         ver_base%=1
  480.         file_compare
  481.         pfad$(8)=f1$
  482.         pfad$(9)=f2$
  483.       ELSE
  484.         do_file_open(f1$)
  485.       ENDIF
  486.       pfad$(7)=f1$
  487.     ENDIF
  488.   ENDIF
  489. RETURN
  490. PROCEDURE warnungen   ! SED-Warnungen ausgeben
  491.   .| Glob. Var.: user_code%,chk_ofls%
  492.   .| Ruft auf  : alrt
  493.   .| Aufruf in : HAUPTPROGRAMM-1,
  494.   ' LOCAL a$
  495.   ' user_code%=@chk_str(a$)
  496.   IF user_code%=0      ! <--- muss angepasst werden
  497.     user_code%=-1
  498.     '    ~@alrt(5,ver$+a$,1,"Alles klar")
  499.   ELSE
  500.     user_code%=1
  501.   ENDIF
  502.   IF chk_ofls%=0
  503.     ~@alrt(3,"Offene Dateien können nicht erkannt werden!|Das kann zu Datenverlust führen!|Bitte CHK_OFLS installieren!",1,"Verstanden")
  504.   ENDIF
  505. RETURN
  506. PROCEDURE chk_ofls    ! Datei_offen_Überwacher installiert?
  507.   .| Glob. Var.: chk_ofls%
  508.   .| Ruft auf  : search_cookie
  509.   .| Aufruf in : HAUPTPROGRAMM-1,
  510.   chk_ofls%=@search_cookie("OFLS",0)
  511. RETURN
  512. '
  513. FUNCTION ofls(drv%)
  514.   .| Glob. Var.: chk_ofls%
  515.   .| Aufruf in : media-1,boot_sec-1,
  516.   IF chk_ofls%>0
  517.     RETURN CARD{chk_ofls%+6+drv%*2}
  518.   ENDIF
  519.   RETURN 0
  520. ENDFUNC
  521. FUNCTION media_all
  522.   .| Glob. Var.: drv_map%,drive%
  523.   .| Ruft auf  : file_is_open,dsetdrv,media
  524.   .| Aufruf in : menu_4-1,fehler_behandlung-1,
  525.   LOCAL i%
  526.   '
  527.   file_is_open
  528.   drv_map%=@dsetdrv(drive%)     ! BIOS(10)
  529.   FOR i%=0 TO 25
  530.     IF (drv_map% AND SHL(1,i%))<>0 AND i%<>20  ! U: überspringen
  531.       IF @media(i%)<0
  532.         RETURN -1
  533.       ENDIF
  534.     ENDIF
  535.   NEXT i%
  536.   RETURN 0
  537. ENDFUNC
  538. '
  539. ' media: Löst auf Laufwerk drv% einen Medienwechsel aus.
  540. ' Prüft, ob auf diesem Laufwerk eine Datei von SED oder anderen
  541. ' Programmen geöffnet ist. Dazu wird CHK_OFLS benötigt oder
  542. ' aber die Funktion Dlock() benötigt.
  543. FUNCTION media(drv%)
  544.   .| Glob. Var.: chk_ofls%,wa$,utis%
  545.   .| Ruft auf  : file_is_open,ofls,alrt
  546.   .| Aufruf in : media_all-1,schreiben-2,disc_info-1,disc_clear-1,disc_load-1
  547.   .|     last_5-1,dir_fldren-1,bios_block-1,
  548.   LOCAL a&
  549.   file_is_open           ! Datei, wenn geöffnet, schließen
  550.   a&=GEMDOS(309,1,drv%)  ! Dlock(sperren)
  551.   IF a&<>-32
  552.     IF a&<0
  553.       ~@alrt(1,"Medienwechsel mit Dlock() auf |Laufwerk "+CHR$(drv%+65)+": nicht möglich, da Dateien|offen sind oder es gesperrt ist!",1,"Abbruch")
  554.       RETURN -1
  555.     ENDIF
  556.     ~GEMDOS(309,0,drv%)  ! Dlock(freigeben)
  557.     RETURN 0
  558.   ELSE
  559.     IF chk_ofls%>0       ! Zeiger auf Struktur "OFLS", ver, data ...
  560.       a&=@ofls(drv%)     ! OFLS lesen
  561.       IF a&>0 AND a&<>&HFFFF
  562.         IF @alrt(1,"Achtung: |möglicher Datenverlust!| "+STR$(a&)+" geöffnete Datei(en)! ",1,wa$)=2
  563.           RETURN -1
  564.         ENDIF
  565.       ENDIF
  566.     ENDIF
  567.     ~C:utis%(&H100+drv%) ! Medienwechsel auslösen
  568.     RETURN 0
  569.   ENDIF
  570. ENDFUNC
  571. '
  572. FUNCTION chk_str(a$)  ! zum prüfen des USER_CODE
  573.   LOCAL a%,i&
  574.   CLR a%
  575.   FOR i&=1 TO LEN(a$)
  576.     ADD a%,ASC(MID$(a$,i&,1))*i&
  577.   NEXT i&
  578.   RETURN a%
  579. ENDFUNC
  580. '
  581. FUNCTION getistr$(index%,typ|)  ! String aus INLINE lesen
  582.   .| Felder    : inl_tab%(),inl_dat%()
  583.   .| Aufruf in : hard_err-1,hard_message-1,hard_search-1,info-1,show_status-1
  584.   .|     sh_hd_err-1,err_inf-1,
  585.   LOCAL t_adr%
  586.   '
  587.   t_adr%=inl_tab%(typ|) ! Tabellenadresse
  588.   IF CARD{t_adr%}>=index% AND index%>=0
  589.     RETURN CHAR{inl_dat%(typ|)+CARD{t_adr%+index%*2+2}}
  590.   ELSE
  591.     RETURN ""
  592.   ENDIF
  593. ENDFUNC
  594. '
  595. FUNCTION rsc_gaddr(tree%)               ! RSC-Baumadresse ermitteln und INIT
  596.   .| Glob. Var.: baum%,dum%,rsc_mem%,hbox%,dh%
  597.   .| Felder    : t_a%()
  598.   .| Aufruf in : rsc_variable-27,
  599.   LOCAL obj&,flg&
  600.   '
  601.   ~RSRC_GADDR(0,tree%,baum%)
  602.   ~FORM_CENTER(baum%,dum%,dum%,dum%,dum%)
  603.   ' ----------------------------
  604.   ' Speicher berechnen für Hintergrund
  605.   rsc_mem%=MAX(rsc_mem%,(OB_W(baum%,0)+6)*(OB_H(baum%,0)+6))
  606.   ' ----------------------------
  607.   CLR obj&
  608.   WHILE obj&>=0
  609.     flg&=OB_FLAGS(baum%,obj&)
  610.     IF (flg& AND 1024)>0        ! Buttons mit SHORT-CUT
  611.       OB_H(baum%,obj&)=OB_H(baum%,obj&)+2
  612.     ENDIF
  613.     SELECT OB_TYPE(baum%,obj&) DIV 256
  614.     CASE 20                     ! BOXTITEL
  615.       OB_Y(baum%,obj&)=OB_Y(baum%,obj&)-(hbox% DIV 2)
  616.     CASE 21
  617.       OB_W(baum%,obj&)=OB_W(baum%,obj&)-1
  618.       OB_H(baum%,obj&)=OB_H(baum%,obj&)-1
  619.     CASE 18                     ! CROSSED
  620.       IF dh%>300
  621.         OB_Y(baum%,obj&)=OB_Y(baum%,obj&)+2
  622.         OB_W(baum%,obj&)=OB_W(baum%,obj&)-2
  623.         OB_H(baum%,obj&)=OB_H(baum%,obj&)-2
  624.       ENDIF
  625.     ENDSELECT
  626.     EXIT IF (flg& AND &H20)>0   ! LASTOB?
  627.     INC obj&
  628.   WEND
  629.   t_a%(tree%)=baum%
  630.   RETURN baum%
  631. ENDFUNC
  632. '
  633. ' was_ist: Prüft auf ESC-Taste oder rechte Maustaste.
  634. '          Wenn einer der beiden Tasten gedrückt ist, wird
  635. '          angeboten, die laufende Option abzubrechen.
  636. ' RETURNS: 0=weiter, 1=Abbruch
  637. FUNCTION was_ist                        ! Abbruch?
  638.   .| Glob. Var.: esc$,wa$
  639.   .| Ruft auf  : mousek,alrt
  640.   .| Aufruf in : hard_bad-2,hard_test_big-2,hard_copy-1,fdc_diskanal-1
  641.   .|     fdc_head-1,ram_check-1,do_sektor_compare-2,disc_clear-1,disc_check-3
  642.   .|     file_dump-1,file_verify-1,pfad_compare-1,do_dump-1,search-1
  643.   .|     fat_check-2,o_neu-1,test_suche-1,
  644.   IF INKEY$=esc$ OR @mousek=2
  645.     RETURN @alrt(2,"Aktion abbrechen?",1,wa$)-1
  646.   ENDIF
  647.   RETURN 0
  648. ENDFUNC
  649. FUNCTION dec_hex_val$(value%,lang%)     ! Zahl formatieren
  650.   .| Glob. Var.: dec%,n$
  651.   .| Aufruf in : show_root-4,fdc_readadress-1,prg_load-1,ram_check-10
  652.   .|     cursor_anz-1,verify_out-1,dir_files-2,do_dump-1,alt_q-6,info-13
  653.   .|     info_platten-1,sh_hd_err-1,fat_bearbeiten-5,fat_cluster-1
  654.   .|     fat_optimum-3,fat_graf_do-1,last_4-2,
  655.   IF dec%>0
  656.     RETURN RIGHT$(n$+STR$(value%),lang%)
  657.   ELSE
  658.     RETURN "$"+HEX$(value%,lang%-1)
  659.   ENDIF
  660. ENDFUNC
  661. FUNCTION nam_conv$(tst$,par%)           ! "TEST.DAT" <-> "TEST    DAT"
  662.   .| Aufruf in : disc_info-1,last_5-1,datei_suchen-2,do_datei_info-2
  663.   .|     dir_secsearch-1,dir_fldren-2,dir_sort-1,o_neu-2,
  664.   LOCAL i%,j%,fil$
  665.   '
  666.   IF par%>0
  667.     '                                   par=1 "test.dat" -> "test    dat"
  668.     i%=INSTR(tst$,".")
  669.     IF i%>0
  670.       fil$=LEFT$(tst$,i%-1)+LEFT$(STRING$(8,32),9-i%)+RIGHT$(tst$,LEN(tst$)-i%)
  671.     ELSE
  672.       fil$=tst$
  673.     ENDIF
  674.     RETURN LEFT$(fil$+STRING$(11,32),11)
  675.   ELSE
  676.     '                                   par=0 "test    dat" -> "test.dat"
  677.     fil$=LEFT$(tst$+STRING$(11,32),11)
  678.     fil$=LEFT$(fil$,8)+"."+RIGHT$(fil$,3)
  679.     DO
  680.       i%=LEN(fil$)
  681.       WHILE MID$(fil$,i%,1)=" " AND i%>1
  682.         DEC i%
  683.       WEND
  684.       fil$=LEFT$(fil$,i%)
  685.       EXIT IF RIGHT$(fil$)<>"."
  686.       fil$=LEFT$(fil$,LEN(fil$)-1)
  687.     LOOP
  688.     CLR i%
  689.     j%=LEN(fil$)
  690.     REPEAT
  691.       INC i%
  692.     UNTIL MID$(fil$,i%,1)=" " OR i%>j%
  693.     IF i%<j%
  694.       fil$=LEFT$(fil$,i%-1)+RIGHT$(fil$,MAX(0,j%-8))
  695.     ENDIF
  696.     RETURN fil$
  697.   ENDIF
  698. ENDFUNC
  699. FUNCTION suche_in_liste(fd$)            ! FIND FILES: Datei in Liste suchen
  700.   .| Glob. Var.: total%
  701.   .| Felder    : file$()
  702.   .| Aufruf in : dir_fldren-1,dir_sort-1,
  703.   LOCAL i&
  704.   i&=1
  705.   REPEAT
  706.     EXIT IF fd$=file$(i&)
  707.     INC i&
  708.   UNTIL i&>total%
  709.   RETURN i&
  710. ENDFUNC
  711. FUNCTION liste_durchgehen(par%)         ! Ordner suchen
  712.   .| Glob. Var.: total%
  713.   .| Felder    : file$()
  714.   .| Aufruf in : last_3-1,
  715.   LOCAL j&,i&,a$,b$,folder$
  716.   '
  717.   CLR i&,j&,folder$
  718.   REPEAT
  719.     INC i&
  720.     a$=file$(i&)
  721.     b$=LEFT$(a$,RINSTR(a$,"\"))         ! Pfad isolieren
  722.     IF b$<>folder$
  723.       INC j&
  724.       folder$=b$
  725.     ENDIF
  726.   UNTIL i&>total% OR i&+j&=par%
  727.   RETURN i&
  728. ENDFUNC
  729. FUNCTION fsel$(f1$,f2$,f3$,par&)        ! FILESELECTBOX Parameter vorbereiten
  730.   .| Felder    : pfad$()
  731.   .| Ruft auf  : fsel_input$,do_pfad
  732.   .| Aufruf in : init_do-1,hard_restore-1,ram_load-1,prg_load-1,disc_load-1
  733.   .|     disc_quick-1,file_open-1,file_compare-2,datei_concat-2,datei_copy-2
  734.   .|     datei_del-1,datei_suchen-1,datei_info-1,dir_secsearch-1,dir_fldren-1
  735.   .|     dir_sort-1,in_file-1,pexec-1,in_help-1,dev-1,opt_ascii-1
  736.   .|     fat_cluster-1,
  737.   LOCAL a$,a&,fi$
  738.   '
  739.   a&=RINSTR(pfad$(par&),"\") !            im Pfad von hinten nach \ suchen
  740.   a$=LEFT$(pfad$(par&),a&)                      ! Pfad
  741.   IF f2$=""
  742.     f2$=RIGHT$(pfad$(par&),LEN(pfad$(par&))-a&) ! Name
  743.   ENDIF
  744.   fi$=a$+f1$                                    ! Pfad+Maske
  745.   a$=@fsel_input$(f3$,fi$,f2$)
  746.   IF LEN(a$)>0
  747.     pfad$(par&)=a$
  748.   ENDIF
  749.   do_pfad(a$)
  750.   RETURN a$
  751. ENDFUNC
  752. FUNCTION fsel_input$(txt$,path$,sel$)   ! Fileselektor aufrufen
  753.   .| Glob. Var.: rom_version%
  754.   .| Aufruf in : fsel-1,
  755.   LOCAL p$,s$,t$,i%
  756.   '
  757.   ~WIND_UPDATE(3)
  758.   p$=STRING$(128,32)
  759.   s$=p$
  760.   MID$(p$,1)=path$+CHR$(0)
  761.   MID$(s$,1)=sel$+CHR$(0)
  762.   ADDRIN(0)=VARPTR(p$)
  763.   ADDRIN(1)=VARPTR(s$)
  764.   IF txt$="" THEN
  765.     GOTO my_fsel_input_
  766.   ENDIF
  767.   IF CARD{LONG{GB+4}}<&H140 OR (CARD{LONG{GB+4}}>=&H200 AND CARD{LONG{GB+4}}<&H300)
  768.     i%=LPEEK(&H5A0)                                ! FSEL-Cookie suchen
  769.     IF i% THEN
  770.       WHILE LPEEK(i%)
  771.         IF LPEEK(i%+4)=CVL("FSEL")
  772.           GOTO my_fsel_exinput_
  773.         ENDIF
  774.         ADD i%,8
  775.       WEND
  776.     ENDIF
  777.     i%=LPEEK(&HB4)                                 ! Trap-13-Vektor untersuchen
  778.     WHILE LPEEK(i%-12)=CVL("XBRA")
  779.       ' Dateiauswahlbox von Martin Patzel, Edison-Utility von Eckard Krajewski
  780.       IF LPEEK(i%-8)=CVL("FSmp") OR LPEEK(i%-8)=CVL("EUek")
  781.         GOTO my_fsel_exinput_
  782.       ENDIF
  783.       i%=LPEEK(i%-4)
  784.     WEND
  785.   my_fsel_input_:
  786.     GEMSYS 90
  787.   ELSE
  788.   my_fsel_exinput_:
  789.     t$=txt$+CHR$(0)
  790.     ADDRIN(2)=VARPTR(t$)
  791.     GCONTRL(0)=91
  792.     GCONTRL(1)=0
  793.     GCONTRL(2)=2
  794.     GCONTRL(3)=3
  795.     GEMSYS
  796.   ENDIF
  797.   ~WIND_UPDATE(2)
  798.   path$=LEFT$(p$,INSTR(p$,CHR$(0))-1)
  799.   sel$=LEFT$(s$,INSTR(s$,CHR$(0))-1)
  800.   IF GINTOUT(1)=1
  801.     RETURN LEFT$(path$,RINSTR(path$,"\"))+sel$
  802.   ELSE
  803.     RETURN ""
  804.   ENDIF
  805. ENDFUNC
  806. FUNCTION akt_find(a%)                   ! Statuszeile in Worte zerlegen
  807.   .| Glob. Var.: wind%,z.breite%,info_line$
  808.   .| Felder    : tx%()
  809.   .| Ruft auf  : info
  810.   .| Aufruf in : stat_line-1,
  811.   LOCAL b%,i%,j%
  812.   '
  813.   b%=(a%-tx%(wind%))/z.breite%+1        ! Abstand von links in Buchstaben
  814.   info
  815.   j%=1
  816.   i%=1
  817.   DO WHILE i%<LEN(info_line$)
  818.     '
  819.     WHILE MID$(info_line$,i%,1)<>" " AND i%<LEN(info_line$)     ! Space suchen
  820.       EXIT IF i%=b%
  821.       INC i%
  822.     WEND
  823.     EXIT IF i%=b%
  824.     INC j%                      ! Wortwechsel
  825.     DO WHILE MID$(info_line$,i%,1)=" " AND i%<LEN(info_line$)      ! <>Space suchen
  826.       INC i%
  827.     LOOP UNTIL i%=b%
  828.     '
  829.   LOOP UNTIL i%=b%
  830.   RETURN j%
  831. ENDFUNC
  832. '
  833. ' no_protekt: Warnt vor bösen Folgen, wenn geschrieben wird
  834. FUNCTION no_protekt                     ! Schreibschutz hilft nix ...
  835.   .| Glob. Var.: hard%,wa$
  836.   .| Ruft auf  : alrt
  837.   .| Aufruf in : hard_zero-2,hard_part-1,hard_format-1,hard_install-1
  838.   .|     hard_noboot-1,hdx_bad-1,hard_copy-1,
  839.   IF hard%<3
  840.     RETURN @alrt(1,"Achtung:|Schreibschutz hilft nix!",0,wa$)
  841.   ELSE
  842.     RETURN 1
  843.   ENDIF
  844. ENDFUNC
  845. '
  846. ' chk_sum: Berechnet Wortprüfsumme des Sektors im Sektorpuffer
  847. FUNCTION chk_sum                        ! Prüfsumme berechnen
  848.   .| Glob. Var.: bps%,buf%
  849.   .| Aufruf in : hard_noboot-1,hard_root-1,boot_sec-1,
  850.   LOCAL i%,j%
  851.   CLR j%
  852.   FOR i%=0 TO bps%-1 STEP 2
  853.     ADD j%,CARD{buf%+i%}     ! Alle Worte zusammenzählen
  854.   NEXT i%
  855.   RETURN (j% AND &HFFFF)
  856. ENDFUNC
  857. '
  858. ' dump_data: Fragt, ob der Puffer als Hex-Dump oder als Datenblock
  859. ' ausgegeben werden soll.
  860. ' RETURNS: 0=Hexdump, 1=Daten
  861. FUNCTION dump_data                      ! DUMP or DATA das ist hier die Frage
  862.   .| Ruft auf  : alrt
  863.   .| Aufruf in : sav_buf-1,sav_block-1,
  864.   RETURN @alrt(2,"Was ausgeben? ",1,"HEX-Dump|Daten")-1
  865. ENDFUNC
  866. '
  867. ' chk_drv: Prüft, ob in chk$ ein neues Laufwerk
  868. ' (also ein anderes als drive%) angegeben ist und
  869. ' stellt eventuell auf das neue Laufwerk um.
  870. '
  871. ' Globale Variablen: drive%
  872. FUNCTION chk_drv(chk$)                  ! Drive umstellen
  873.   .| Glob. Var.: drive%
  874.   .| Ruft auf  : boot_sec
  875.   .| Aufruf in : dir_secsearch-1,dir_fldren-1,dir_sort-1,fat_cluster-1,
  876.   IF MID$(chk$,2,1)<>":" !                Laufwerk voranstellen, wenn noch nicht da
  877.     chk$=CHR$(drive%+65)+"\"+chk$
  878.   ENDIF
  879.   IF (ASC(chk$)-65)<>drive% !             Enthält Pfad das aktuelle Laufwerk?
  880.     drive%=ASC(chk$)-65 !                 Nein, Laufwerk umstellen
  881.     boot_sec !                            Bootsektor-Informationen lesen
  882.   ENDIF
  883.   RETURN 0
  884. ENDFUNC
  885. FUNCTION get_fld_name$(fi$)             ! Ordner isolieren
  886.   .| Aufruf in : dir_secsearch-1,dir_fldren-1,dir_sort-1,
  887.   LOCAL a&,b&
  888.   a&=RINSTR(fi$,"\") !                    nach letztem Backslash suchen
  889.   IF a&>0
  890.     b&=RINSTR(a&-1,fi$,"\") !             noch einen Backslash suchen
  891.   ENDIF
  892.   IF a&<>b& AND b&>0 AND a&>0 !           mindestens zwei Slashes sollten's schon sein
  893.     RETURN MID$(fi$,b&+1,a&-b&-1)       ! letzten Ordner isolieren
  894.   ELSE
  895.     RETURN ""                           ! sonst im Wurzelverzeichnis
  896.   ENDIF
  897. ENDFUNC
  898. FUNCTION eingabe(txt$,ta%)              ! Zahl eingeben
  899.   .| Glob. Var.: eok&,e.l%,el%,e.ingabe%,ergebnis&
  900.   .| Ruft auf  : do_input,get_val
  901.   .| Aufruf in : hard_write-1,part_gleiche-1,do_part_cbhd-1,hard_copy-5
  902.   .|     fdc_trkread-1,fdc_trkwrite-1,fdc_secread-2,fdc_secwrite-2,fdc_null-3
  903.   .|     ram_adress_read-1,ram_adress_write-1,ram_save-2,ram_load-1
  904.   .|     sektor_read-1,sektor_write-1,sektor_cluster-1,ph_track-1,ph_sec-1
  905.   .|     set_list_offset-1,address-1,disass-1,test_suche-1,
  906.   LOCAL ex_obj&
  907.   '
  908.   ex_obj&=@do_input(txt$,ta%)
  909.   '
  910.   IF ex_obj&=eok&
  911.     CLR e.l%
  912.     el%=1
  913.     RETURN @get_val(e.ingabe%,ergebnis&)
  914.   ELSE
  915.     CLR el%
  916.     e.l%=1
  917.     RETURN 0
  918.   ENDIF
  919. ENDFUNC
  920. FUNCTION do_input(txt$,ta%)
  921.   .| Glob. Var.: e.ingabe%,etext&,dec%,b$,ergebnis&,ex_obj&
  922.   .| Ruft auf  : put_char,box_draw,form_do,box_undraw,clr_state
  923.   .| Aufruf in : eingabe-1,hard_read-1,
  924.   put_char(e.ingabe%,etext&,txt$)
  925.   IF dec%=1
  926.     b$=STR$(ta%)
  927.   ELSE
  928.     b$="$"+HEX$(ta%)
  929.   ENDIF
  930.   put_char(e.ingabe%,ergebnis&,b$)
  931.   box_draw(e.ingabe%)
  932.   ex_obj&=@form_do(e.ingabe%) AND 255
  933.   box_undraw(e.ingabe%)
  934.   clr_state(e.ingabe%,ex_obj&,1)
  935.   RETURN ex_obj&
  936. ENDFUNC
  937. FUNCTION get_char$(tree%,obj&)          ! String aus Dialog auslesen
  938.   .| Aufruf in : get_val-1,hard_read-1,get_id-1,get_value-1,sektor_compare-2
  939.   .|     set_kleine_buttons-3,set_menu-1,disc_info-2,do_datei_info-3,search-2
  940.   .|     einname-1,eintext-1,check_vor-1,
  941.   SELECT OB_TYPE(tree%,obj&) AND &HFF
  942.   CASE 21,22,29,30
  943.     RETURN CHAR{{OB_SPEC(tree%,obj&)}}
  944.   DEFAULT
  945.     RETURN CHAR{OB_SPEC(tree%,obj&)}
  946.   ENDSELECT
  947. ENDFUNC
  948. FUNCTION get_val(tree%,obj&)            ! Zahl aus Dialog ...
  949.   .| Ruft auf  : term$,get_char$
  950.   .| Aufruf in : eingabe-1,hard_command-10,hard_param-10,fdc_trackconfig-10
  951.   .|     sektor_compare-3,disc_info-10,do_datei_info-1,check_vor-3,
  952.   RETURN VAL(@get_char$(tree%,obj&))
  953. ENDFUNC
  954. FUNCTION alrt(icon%,text$,default%,butext$) ! eigene ALERT-BOX
  955.   .| Glob. Var.: alrtb1&,alrtb4&,a.lert%,alrti1&,alrti5&,ab%,z.b%,z.h%,alrtz1&
  956.   .|     alrtz5&,alrtohr&,box_draw%,box_addr%
  957.   .| Felder    : bt$(),bz$()
  958.   .| Ruft auf  : clr_flags,set_flags,put_char,box_undraw,box_draw,form_do
  959.   .|     clr_state,set_mouse
  960.   .| Aufruf in : rsc_init-2,warnungen-1,media-1,was_ist-1,no_protekt-1
  961.   .|     dump_data-1,nur_daten_fenster-1,nur_text_fenster-1,init_font-2
  962.   .|     init_help-2,scsicall-1,hard_message-1,hard_command-1
  963.   .|     hard_mode_select-1,hard_prot-1,hard_ship-1,hard_zero-1
  964.   .|     hard_part_sel-1,do_part-1,hard_format-2,hard_install-3,hard_noboot-2
  965.   .|     hard_restore-5,hdx_bad-2,hard_bad-2,hdx_set_bad-1,do_mark_bad-1
  966.   .|     check_bsl-2,nix_vortex-2,hard_copy-1,fdc_bytes-1,fdc_drive-1
  967.   .|     convert-1,gap-1,fdc_anal-1,fdc_head-1,fdc_null-2,hdumschaltung-1
  968.   .|     ram_read-1,ram_write-1,ram_save-2,ram_load-1,prg_load-2
  969.   .|     clr_prg_load-2,change-1,sektor_read-1,sektor_write-1
  970.   .|     sektor_cluster-1,ph_track-1,ph_sec-1,ph_side-1,sektor_physik_do-1
  971.   .|     sec_write_sure-1,sektor_compare-1,do_sektor_compare-2,wind_open-1
  972.   .|     dat_sichern_als-2,dat_drucken-2,disc_info-2,boot_sec-1,boot_wrong-1
  973.   .|     disc_clear-2,disc_save-1,disc_check-2,disc_drive-1,file_repair-1
  974.   .|     last_5-6,file_close-1,file_write-2,file_dump-1,datei_cut-2
  975.   .|     datei_del-1,do_file_copy-1,do_file_open-1,do_datei_info-1
  976.   .|     dir_secsearch-1,last_3-1,dir_sort-1,last_12-1,in_file-1,pexec-1
  977.   .|     do_pexec-1,about_me-3,exit-1,search-3,wandlung-3,info_crc-3,last_9-1
  978.   .|     log_out-1,printer-1,dev-1,opt_help-1,opt_text-1,opt_fehler-2
  979.   .|     err_inf1-1,err_max-1,fat_bearbeiten-1,fat_cluster-1,fat_test-3
  980.   .|     fat_xor-1,nur_eine_fat-1,cl_up-2,cl_down-2,bios_block-3,find_files-2
  981.   .|     fehler_behandlung-1,disass-1,temple_disass-1,init_ram-2,test_suche-1,
  982.   LOCAL a%,b%,c%,i&,ih%,io%,j%,x%,az%,erg%,albt%,albz%,bt%,zrl%
  983.   LOCAL box_xxx%,box_back%,ex_obj&,txt$,old_alrtw%,old_alrth%
  984.   '
  985.   FOR i&=1 TO 5
  986.     bt$(i&)=""                  ! Buttontexte clr
  987.     bz$(i&)=""                  ! ALERT Texte clr
  988.   NEXT i&
  989.   FOR i&=alrtb1& TO alrtb4&
  990.     clr_flags(a.lert%,i&,&H82)  ! HIDE + DEFAULT clr
  991.   NEXT i&
  992.   FOR i&=alrti1& TO alrti5&
  993.     set_flags(a.lert%,i&,&H80)  ! ICONs alle HIDE
  994.   NEXT i&
  995.   ' ---------------------------------------------------------
  996.   a%=alrti1&+icon%-1
  997.   clr_flags(a.lert%,a%,&H80) ! neues ICON unHIDE
  998.   ih%=OB_H(a.lert%,a%)
  999.   io%=OB_Y(a.lert%,a%)
  1000.   '
  1001.   CLR albt%,albz%
  1002.   bt%=1
  1003.   j%=1
  1004.   txt$=butext$+"|"
  1005.   FOR i&=1 TO LEN(txt$)
  1006.     IF MID$(txt$,i&,1)="|"
  1007.       bt$(bt%)=MID$(txt$,j%,i&-j%)+CHR$(0)      ! Buttontext in einzelne Worte
  1008.       albt%=MAX(albt%,i&-j%)                    ! für Breite
  1009.       j%=i&+1
  1010.       INC bt%
  1011.     ENDIF
  1012.   NEXT i&
  1013.   DEC bt%
  1014.   INC albt%
  1015.   '
  1016.   IF default%>0                 ! DEFAULT-Button angegeben?
  1017.     set_flags(a.lert%,alrtb1&+default%-1,2)
  1018.   ENDIF
  1019.   '
  1020.   txt$=text$+"|"                ! ALERT-Text in einzelne Zeilen zerlegen
  1021.   az%=1
  1022.   j%=1
  1023.   FOR i&=1 TO LEN(txt$)
  1024.     IF MID$(txt$,i&,1)="|"
  1025.       bz$(az%)=MID$(txt$,j%,i&-j%)+CHR$(0)
  1026.       albz%=MAX(albz%,i&-j%)
  1027.       j%=i&+1
  1028.       INC az%                   ! Anzahl der Textzeilen
  1029.     ENDIF
  1030.   NEXT i&
  1031.   '
  1032.   old_alrth%=OB_H(a.lert%,0)    ! alte Höhe der Box
  1033.   old_alrtw%=OB_W(a.lert%,0)    ! alte Breite ...
  1034.   ab%=albt%*z.b%                ! Breite der Buttons
  1035.   OB_H(a.lert%,0)=MAX(io%+ih%+z.h%*2,(az%+3)*z.h%) ! neue Höhe der ALERT-Box
  1036.   '
  1037.   CLR j%
  1038.   FOR i&=alrtb1& TO alrtb4&
  1039.     INC j%
  1040.     OB_W(a.lert%,i&)=ab%                                ! Button Breite
  1041.     OB_Y(a.lert%,i&)=OB_H(a.lert%,0)-z.h%*2             ! Button y-Pos
  1042.     put_char(a.lert%,i&,LEFT$(bt$(j%),10)+CHR$(0))      ! Button-Text setzen
  1043.   NEXT i&
  1044.   '
  1045.   zrl%=OB_X(a.lert%,alrtz1&)
  1046.   a%=z.b%*2                             ! Buttonzwischenraum=2 Zeichen
  1047.   c%=MAX((albz%+2)*z.b%,bt%*(ab%+a%))+zrl%+OB_W(a.lert%,alrti1&)
  1048.   OB_W(a.lert%,0)=c%                    ! neue Breite der ALERT-Box
  1049.   b%=c%/2
  1050.   '
  1051.   FOR i&=alrtb4& DOWNTO alrtb1&+bt%
  1052.     set_flags(a.lert%,i&,&H80)          ! nicht benötigte Buttons = HIDE
  1053.   NEXT i&
  1054.   x%=OB_W(a.lert%,0)-(ab%+a%+z.b%*2)    ! 1. Button rechts
  1055.   FOR i&=alrtb4&-(4-bt%) DOWNTO alrtb1&
  1056.     OB_X(a.lert%,i&)=x%
  1057.     SUB x%,ab%+a%                       ! die anderen nach links versetzen
  1058.   NEXT i&
  1059.   '
  1060.   CLR j%                                ! hier die Textzeilen setzen
  1061.   FOR i&=alrtz1& TO alrtz5&
  1062.     INC j%
  1063.     IF LEN(bz$(j%))>0
  1064.       put_char(a.lert%,i&,LEFT$(bz$(j%),45))
  1065.       OB_W(a.lert%,i&)=LEN(bz$(j%))*z.b%-z.b%
  1066.       clr_flags(a.lert%,i&,&H80)        ! Zeile sichtbar
  1067.     ELSE
  1068.       set_flags(a.lert%,i&,&H80)        ! Zeile x = HIDE
  1069.     ENDIF
  1070.   NEXT i&
  1071.   '                                     ! Eselsohr neu positionieren!
  1072.   OB_X(a.lert%,alrtohr&)=OB_W(a.lert%,0)-OB_W(a.lert%,alrtohr&)
  1073.   '                                     ! ALERT neu zentrieren
  1074.   OB_X(a.lert%,0)=OB_X(a.lert%,0)+(old_alrtw%-OB_W(a.lert%,0))/2
  1075.   OB_Y(a.lert%,0)=OB_Y(a.lert%,0)+(old_alrth%-OB_H(a.lert%,0))/2
  1076.   '
  1077.   ' ~WIND_GET(0,17,h_adr%,l_adr%,h_len%,l_len%)
  1078.   ' alert_size%=OB_H(a.lert%,0)*OB_W(a.lert%,0)/8*planes%
  1079.   ' internen AES-Puffer könnte man für ALERT benutzen, erfordert aber
  1080.   ' _einige_ Änderungen!
  1081.   '
  1082.   IF box_draw%>0                ! Noch ein Dialog sichtbar?
  1083.     box_xxx%=box_addr%          ! Baumadresse merken
  1084.     box_undraw(box_addr%)       ! Ja, löschen
  1085.     box_back%=1                 ! und merken
  1086.   ENDIF
  1087.   '
  1088.   box_draw(a.lert%)                     ! und nun zeichnen
  1089.   ex_obj&=@form_do(a.lert%)
  1090.   box_undraw(a.lert%)
  1091.   clr_state(a.lert%,ex_obj&,1)
  1092.   erg%=ex_obj&-alrtb1&+1
  1093.   '
  1094.   IF box_back%>0                        ! Wenn Dialog vorher auf Screen war
  1095.     box_draw(box_xxx%)                  ! dann jetzt wieder herstellen
  1096.     CLR box_back%
  1097.   ENDIF
  1098.   set_mouse                             ! Mausform wieder herstellen
  1099.   '
  1100.   RETURN erg%
  1101. ENDFUNC
  1102. '
  1103. ' search_cookie: Sucht im Cookiepuffer nach dem Cookie
  1104. ' coc$. Wenn was% auf 1 ist, wird zusätzlich noch der
  1105. ' Inhalt der durchlaufenen Cookies ausgegeben.
  1106. FUNCTION search_cookie(coc$,was%)       ! Cookies suchen
  1107.   .| Ruft auf  : out
  1108.   .| Aufruf in : mc_init-3,chk_ofls-1,ram_cookie-1,temple_disass-1,
  1109.   LOCAL adr%,i|,x%,a$
  1110.   '
  1111.   a$="    "                     ! Puffer mit vier Zeichen
  1112.   adr%=LPEEK(&H5A0)
  1113.   IF adr%>0
  1114.     WHILE LPEEK(adr%)
  1115.       FOR i|=0 TO 3
  1116.         BYTE{V:a$+i|}=BYTE{adr%+i|}
  1117.       NEXT i|
  1118.       x%={adr%+4}
  1119.       IF a$=coc$
  1120.         RETURN x%
  1121.       ENDIF
  1122.       IF was%=1
  1123.         out(a$+"  $"+HEX$(x%,8)+" "+MKL$(x%))
  1124.       ENDIF
  1125.       ADD adr%,8
  1126.     WEND
  1127.   ENDIF
  1128.   RETURN 0
  1129. ENDFUNC
  1130. FUNCTION set_hard(target%)              ! setzt Plattentyp zum Target
  1131.   .| Felder    : hd_typ%()
  1132.   .| Aufruf in : rsc_init-1,hard_search-1,last_11-1,sel_target_geraet-1
  1133.   .|     hard_do_copy-2,set_dma_mask-1,
  1134.   IF target%<8
  1135.     RETURN hd_typ%(target%)     ! Plattentyp zum Target holen
  1136.   ELSE
  1137.     RETURN 3                    ! immer = SCSI
  1138.   ENDIF
  1139. ENDFUNC
  1140. FUNCTION runden$(a#)                     !
  1141.   .| Aufruf in : unit_ready-2,hard_root-1,show_root-1,
  1142.   RETURN STR$(INT(a#*10)/10)
  1143. ENDFUNC
  1144. '
  1145. PROCEDURE change_pfad(pfad%,drive%)     ! Pfad für FILESELECT manipulieren
  1146.   .| Felder    : pfad$()
  1147.   .| Aufruf in : disc_quick-1,dir_secsearch-1,dir_fldren-1,dir_sort-1
  1148.   .|     fat_cluster-1,
  1149.   MID$(pfad$(pfad%),1)=CHR$(drive%+65)
  1150. RETURN
  1151. PROCEDURE mdisk                         ! Maus als DISC
  1152.   .| Glob. Var.: mdisk%,maus_form%
  1153.   .| Aufruf in : set_mouse-1,clr_part-1,hard_format-1,last_11-1,hard_bad-1
  1154.   .|     hard_copy-1,fdc_speed-1,fdc_diskanal-1,lesen-1,boot_sec-1
  1155.   .|     disc_check-2,do_file_copy-1,
  1156.   ~GRAF_MOUSE(255,mdisk%)
  1157.   maus_form%=4
  1158. RETURN
  1159. PROCEDURE mtasse                        !      ... Tasse
  1160.   .| Glob. Var.: mtasse%,maus_form%
  1161.   .| Aufruf in : set_mouse-1,save_einstellungen-1,hard_search-1,hard_save-1
  1162.   .|     do_clr_out-1,disc_quick-1,disc_check-1,file_verify-1,dir_files-1
  1163.   .|     sav_buf-1,sav_block-1,print_blk-1,put_to_fkey-1,do_pexec-1,log_out-1
  1164.   .|     floskel-1,fat_check-1,fat_graph-1,fat_graf_do-1,cl_down-1
  1165.   .|     find_files-1,temple_disass-1,sed_disass-1,
  1166.   ~GRAF_MOUSE(255,mtasse%)
  1167.   maus_form%=3
  1168. RETURN
  1169. PROCEDURE mnorm                         !      ... normal
  1170.   .| Glob. Var.: maus_form%
  1171.   .| Aufruf in : meinform_do-1,save_einstellungen-1,hard_part-1,hard_format-1
  1172.   .|     hard_search-1,hard_save-1,fdc_speed-1,lern_ende-1
  1173.   .|     message_auswerten-1,redraw_list-1,do_clr_out-1,disc_clear-1
  1174.   .|     disc_check-1,file_dump-1,file_verify-1,do_file_copy-1,dir_files-1
  1175.   .|     dir_fldren-1,sav_buf-1,sav_block-1,put_to_fkey-1,log_out-1
  1176.   .|     fat_check-1,cl_down-1,find_files-1,
  1177.   ~GRAF_MOUSE(0,0)
  1178.   maus_form%=0
  1179. RETURN
  1180. PROCEDURE mhand
  1181.   .| Glob. Var.: maus_form%
  1182.   .| Aufruf in : set_kleine_buttons-1,
  1183.   ~GRAF_MOUSE(4,0)
  1184.   maus_form%=2
  1185. RETURN
  1186. PROCEDURE set_mouse                     ! Maus wieder auf richtige Form
  1187.   .| Glob. Var.: maus_form%
  1188.   .| Ruft auf  : mtasse,mdisk
  1189.   .| Aufruf in : alrt-1,
  1190.   SELECT maus_form%
  1191.   CASE 0
  1192.     ~GRAF_MOUSE(0,0)    ! Pfeil
  1193.   CASE 1
  1194.     ~GRAF_MOUSE(1,0)    ! Biene
  1195.   CASE 2
  1196.     ~GRAF_MOUSE(4,0)    ! Hand
  1197.   CASE 3
  1198.     mtasse              ! Tasse
  1199.   CASE 4
  1200.     mdisk               ! Disk
  1201.   ENDSELECT
  1202. RETURN
  1203. '
  1204. PROCEDURE kling                         ! macht PING
  1205.   .| Aufruf in : meinform_do-2,
  1206.   SOUND 1,15,440
  1207.   WAVE 1,1,1,8000,0
  1208. RETURN
  1209. PROCEDURE nur_daten_fenster
  1210.   .| Ruft auf  : alrt
  1211.   .| Aufruf in : alt_f-1,alt_t-1,ctrl_c-1,ctrl_t-1,set_list_offset-1
  1212.   .|     address-1,info_crc-1,
  1213.   ~@alrt(1,"Das geht nur im Datenfenster!",1," Aha ")
  1214. RETURN
  1215. PROCEDURE nur_text_fenster
  1216.   .| Ruft auf  : alrt (tot)
  1217.   ~@alrt(1,"Das geht nur im Textfenster!",1," Aha ")
  1218. RETURN
  1219. ' ----------------------
  1220. PROCEDURE put_char(tree%,obj&,txt$)     ! String in Dialog schreiben
  1221.   .| Aufruf in : set_rsc-4,do_input-2,alrt-2,put_wert-1,setfont-4,set_help-1
  1222.   .|     hard_command-1,hard_part-1,set_part_par-1,add_size-1,set_part_dial-1
  1223.   .|     hard_part_sel-1,part_select-2,hard_format-2,hard_bad-5,hard_param-2
  1224.   .|     fdc_speed-3,fdc_protect-3,do_sektor_compare-3,set_kleine_buttons-3
  1225.   .|     disc_info-10,disc_clear-4,do_datei_info-8,ctrl_t-2,search-2
  1226.   .|     einname-2,eintext-2,opt_konfig-1,set_dma_mask-1,fat_bearbeiten-5,
  1227.   SELECT OB_TYPE(tree%,obj&) AND &HFF
  1228.   CASE 21,22,29,30
  1229.     CHAR{{OB_SPEC(tree%,obj&)}}=txt$
  1230.   DEFAULT
  1231.     CHAR{OB_SPEC(tree%,obj&)}=txt$
  1232.   ENDSELECT
  1233. RETURN
  1234. PROCEDURE put_wert(tree%,obj&,wert%,ll%)
  1235.   .| Ruft auf  : put_char
  1236.   .| Aufruf in : set_rsc-3,set_part_dial-1,hard_param-9,disc_info-10
  1237.   .|     do_datei_info-1,
  1238.   put_char(tree%,obj&,RIGHT$(SPACE$(ll%)+STR$(wert%),ll%))
  1239. RETURN
  1240. '
  1241. PROCEDURE select_rsc(tree%,obj&,wert&)  ! OBJECT select
  1242.   .| Ruft auf  : set_state,clr_state (tot)
  1243.   IF wert&>0                    ! jenach Wert 'OBJ' selectieren oder nicht
  1244.     set_state(tree%,obj&,1)
  1245.   ELSE
  1246.     clr_state(tree%,obj&,1)
  1247.   ENDIF
  1248. RETURN
  1249. PROCEDURE cross_rsc(tree%,obj&,wert&)   ! OBJECT cross
  1250.   .| Ruft auf  : set_state,clr_state
  1251.   .| Aufruf in : set_rsc-10,hard_command-1,do_datei_info-2,set_targ-1,
  1252.   IF wert&>0                    ! jenach Wert 'OBJ' selectieren oder nicht
  1253.     set_state(tree%,obj&,2)
  1254.   ELSE
  1255.     clr_state(tree%,obj&,2)
  1256.   ENDIF
  1257. RETURN
  1258. ' ---------------------- RSC  ---------------------
  1259. PROCEDURE box_draw(tree%)               ! Dialog zeichnen
  1260.   .| Glob. Var.: dial.pos%,dw%,dy%,dh%,h%,box_draw%,box_addr%
  1261.   .| Felder    : mem%()
  1262.   .| Ruft auf  : xywh,scr2mem,init_button
  1263.   .| Aufruf in : do_input-1,alrt-2,setfont-1,hard_command-1,hard_part_sel-1
  1264.   .|     part_select-1,part_gleiche-1,hard_format-1,hard_bad-1,hard_param-1
  1265.   .|     sel_target_geraet-1,fdc_speed-1,fdc_steprate-1,fdc_trackconfig-1
  1266.   .|     fdc_protect-1,disass_konv-1,sektor_compare-1,do_sektor_compare-1
  1267.   .|     set_kleine_buttons-1,disc_info-1,disc_clear-1,disc_drive-1
  1268.   .|     do_datei_info-1,ctrl_t-2,search-1,einname-1,eintext-1,infos-1
  1269.   .|     opt_konfig-1,einstellungen-1,opt_help-1,set_dma_mask-1
  1270.   .|     fat_bearbeiten-1,
  1271.   LOCAL bx%,by%,x%,y%,w%
  1272.   '
  1273.   IF dial.pos%>0
  1274.     ~GRAF_MKSTATE(x%,y%,w%,w%)
  1275.     bx%=x%-(OB_W(tree%,0)-6) DIV 2
  1276.     by%=y%-(OB_H(tree%,0)-6) DIV 2
  1277.   ELSE
  1278.     bx%=OB_X(tree%,0)
  1279.     by%=OB_Y(tree%,0)
  1280.   ENDIF
  1281.   OB_X(tree%,0)=MIN(dw%-OB_W(tree%,0)-6,MAX(3,bx%))
  1282.   OB_Y(tree%,0)=MAX(dy%+3,MIN(dh%-OB_H(tree%,0)-6,by%))
  1283.   xywh
  1284.   IF mem%(0)=0
  1285.     ~FORM_DIAL(0,0,0,0,0,x%,y%,w%,h%)
  1286.   ELSE
  1287.     scr2mem(x%,y%,w%,h%)
  1288.   ENDIF
  1289.   box_draw%=1
  1290.   box_addr%=tree%
  1291.   ~WIND_UPDATE(1)
  1292.   ~OBJC_DRAW(tree%,0,8,x%,y%,w%,h%)
  1293.   init_button(tree%)    ! Unterstriche zeichnen
  1294. RETURN
  1295. PROCEDURE box_undraw(tree%)             ! Hintergrund zurück
  1296.   .| Glob. Var.: x%,y%,w%,h%,box_draw%
  1297.   .| Felder    : mem%()
  1298.   .| Ruft auf  : xywh,mem2scr
  1299.   .| Aufruf in : do_input-1,alrt-2,setfont-1,hard_command-1,hard_part_sel-1
  1300.   .|     part_select-1,part_gleiche-1,hard_format-1,hard_bad-2,hard_param-1
  1301.   .|     sel_target_geraet-1,fdc_speed-1,fdc_steprate-1,fdc_trackconfig-1
  1302.   .|     fdc_protect-1,disass_konv-1,sektor_compare-1,do_sektor_compare-1
  1303.   .|     set_kleine_buttons-1,disc_info-1,disc_clear-1,disc_drive-1
  1304.   .|     do_datei_info-1,ctrl_t-2,search-1,einname-1,eintext-1,infos-1
  1305.   .|     opt_konfig-1,einstellungen-1,opt_help-1,set_dma_mask-1
  1306.   .|     fat_bearbeiten-1,
  1307.   xywh
  1308.   IF mem%(0)<=0
  1309.     ~FORM_DIAL(3,0,0,0,0,x%,y%,w%,h%)
  1310.   ELSE
  1311.     mem2scr(x%,y%,w%,h%)
  1312.   ENDIF
  1313.   ~WIND_UPDATE(0)
  1314.   CLR box_draw%
  1315. RETURN
  1316. PROCEDURE xywh
  1317.   .| Glob. Var.: x%,tree%,y%,w%,h%
  1318.   .| Aufruf in : box_draw-1,box_undraw-1,meinform_do-3,
  1319.   x%=OB_X(tree%,0)-3
  1320.   y%=OB_Y(tree%,0)-3
  1321.   w%=OB_W(tree%,0)+6
  1322.   h%=OB_H(tree%,0)+6
  1323. RETURN
  1324. PROCEDURE objc_update(tree%,obj&)
  1325.   .| Ruft auf  : draw_underline
  1326.   .| Aufruf in : meinform_do-2,setfont-4,hard_command-4,set_part_par-2
  1327.   .|     part_slide-1,part_slide_page-1,set_part_dial-2,hard_part_sel-1
  1328.   .|     part_select-2,hard_bad-3,fdc_speed-1,fdc_protect-1
  1329.   .|     do_sektor_compare-1,disc_clear-2,ctrl_t-1,set_dma_mask-1,set_targ-1
  1330.   .|     fat_bearbeiten-4,
  1331.   LOCAL a%,b%,x%,y%
  1332.   '
  1333.   ~OBJC_OFFSET(tree%,obj&,x%,y%)
  1334.   ~WIND_UPDATE(1)
  1335.   ~OBJC_DRAW(tree%,obj&,8,x%,y%,OB_W(tree%,obj&),OB_H(tree%,obj&))
  1336.   a%=OB_FLAGS(tree%,obj&)
  1337.   b%=OB_STATE(tree%,obj&)
  1338.   IF (a% AND 1024)>0    ! Button mit Taste
  1339.     IF (b% AND 8)=0 AND ((a% AND &H80)=0)
  1340.       draw_underline(tree%,obj&)
  1341.     ENDIF
  1342.   ENDIF
  1343.   ~WIND_UPDATE(0)
  1344. RETURN
  1345. PROCEDURE scr2mem(x%,y%,w%,h%)          ! Hintergrund retten
  1346.   .| Glob. Var.: dx%,dy%,dw%,dh%
  1347.   .| Felder    : par%(),mem%(),scr%()
  1348.   .| Aufruf in : box_draw-1,meinform_do-1,
  1349.   par%(0)=x%
  1350.   par%(1)=y%
  1351.   par%(2)=x%+w%-1
  1352.   par%(3)=y%+h%-1
  1353.   par%(4)=0
  1354.   par%(5)=0
  1355.   par%(6)=w%-1
  1356.   par%(7)=h%-1
  1357.   par%(8)=3
  1358.   mem%(1)=w%
  1359.   mem%(2)=h%
  1360.   mem%(3)=((w%+15) DIV 16)
  1361.   CLIP dx%,dy%,dw%,dh%
  1362.   ~GRAF_MOUSE(256,0)
  1363.   BITBLT scr%(),mem%(),par%()
  1364.   ~GRAF_MOUSE(257,0)
  1365.   CLIP OFF
  1366. RETURN
  1367. PROCEDURE mem2scr(x%,y%,w%,h%)          !    "        zurück
  1368.   .| Glob. Var.: dx%,dy%,dw%,dh%
  1369.   .| Felder    : par%(),mem%(),scr%()
  1370.   .| Aufruf in : box_undraw-1,meinform_do-2,
  1371.   par%(4)=x%
  1372.   par%(5)=y%
  1373.   par%(6)=x%+w%-1
  1374.   par%(7)=y%+h%-1
  1375.   par%(0)=0
  1376.   par%(1)=0
  1377.   par%(2)=w%-1
  1378.   par%(3)=h%-1
  1379.   par%(8)=3
  1380.   CLIP dx%,dy%,dw%,dh%
  1381.   ~GRAF_MOUSE(256,0)
  1382.   BITBLT mem%(),scr%(),par%()
  1383.   ~GRAF_MOUSE(257,0)
  1384.   CLIP OFF
  1385. RETURN
  1386. PROCEDURE set_state(tree%,obj&,par%)    ! OBJECT-Status ändern
  1387.   .| Aufruf in : select_rsc-1,cross_rsc-1,setfont-1,hard_part-1
  1388.   .|     only_used_target-1,all_targets-3,fdc_steprate-3,set_button-1
  1389.   .|     set_mod_button-1,disc_drive-2,ctrl_t-1,
  1390.   OB_STATE(tree%,obj&)=OB_STATE(tree%,obj&) OR par%
  1391. RETURN
  1392. PROCEDURE clr_state(tree%,obj&,par%)    !   "
  1393.   .| Aufruf in : do_input-1,alrt-1,select_rsc-1,cross_rsc-1,setfont-2
  1394.   .|     hard_command-1,hard_part-1,hard_part_sel-3,part_select-2
  1395.   .|     hard_param-1,sel_target_geraet-2,only_used_target-2,all_targets-2
  1396.   .|     fdc_steprate-4,fdc_trackconfig-1,disass_konv-1,sektor_compare-1
  1397.   .|     clr_button-1,set_kleine_buttons-1,disc_info-1,disc_drive-2
  1398.   .|     do_datei_info-1,ctrl_t-3,search-1,einname-1,eintext-1,infos-1
  1399.   .|     opt_konfig-1,einstellungen-1,opt_help-1,set_dma_mask-1
  1400.   .|     fat_bearbeiten-1,
  1401.   OB_STATE(tree%,obj&)=OB_STATE(tree%,obj&) AND (NOT par%)
  1402. RETURN
  1403. PROCEDURE set_flags(tree%,obj&,par%)    !   "
  1404.   .| Aufruf in : alrt-4,set_help-1,only_used_target-1,all_targets-1
  1405.   .|     disc_drive-1,do_datei_info-3,opt_help-1,
  1406.   OB_FLAGS(tree%,obj&)=OB_FLAGS(tree%,obj&) OR par%
  1407. RETURN
  1408. PROCEDURE clr_flags(tree%,obj&,par%)    !   "
  1409.   .| Aufruf in : alrt-3,set_help-1,only_used_target-1,disc_drive-1
  1410.   .|     do_datei_info-3,opt_help-2,
  1411.   OB_FLAGS(tree%,obj&)=OB_FLAGS(tree%,obj&) AND (NOT par%)
  1412. RETURN
  1413. '
  1414. PROCEDURE init_button(tree%)            ! Button mit SHORT-CUT zeichnen
  1415.   .| Glob. Var.: scr_handle%
  1416.   .| Ruft auf  : draw_underline,v_line
  1417.   .| Aufruf in : box_draw-1,meinform_do-1,
  1418.   LOCAL j&,x&,y&,flg%
  1419.   '
  1420.   CLR j&
  1421.   ~GRAF_MOUSE(256,0)
  1422.   WHILE j&>=0
  1423.     flg%=OB_FLAGS(tree%,j&)
  1424.     IF (flg% AND 1024)>0                ! Button mit Taste
  1425.       IF (OB_STATE(tree%,j&) AND 8)=0 AND ((flg% AND &H80)=0)
  1426.         draw_underline(tree%,j&)
  1427.       ENDIF
  1428.     ENDIF
  1429.     IF (OB_TYPE(tree%,j&) DIV 256)=17   ! Eselsohr
  1430.       ~OBJC_OFFSET(tree%,j&,x&,y&)
  1431.       v_line(scr_handle%,x&-1,y&-1,x&+OB_W(tree%,j&),y&+OB_H(tree%,j&))
  1432.     ENDIF
  1433.     EXIT IF (flg% AND &H20)>0           ! LASTOB
  1434.     INC j&
  1435.   WEND
  1436.   ~GRAF_MOUSE(257,0)
  1437. RETURN
  1438. PROCEDURE draw_underline(tree%,j&)      ! ...
  1439.   .| Glob. Var.: z.b%,z.h%,scr_handle%
  1440.   .| Ruft auf  : get_pixel,vswr_mode,v_line
  1441.   .| Aufruf in : objc_update-1,init_button-1,
  1442.   LOCAL a%,i&,x&,y&,a$
  1443.   '
  1444.   ~OBJC_OFFSET(tree%,j&,x&,y&)
  1445.   a$=CHAR{OB_SPEC(tree%,j&)}
  1446.   a%=LEN(a$)
  1447.   i&=1
  1448.   WHILE MID$(a$,i&,1)=" " AND i&<a%
  1449.     INC i&
  1450.   WEND
  1451.   ADD x&,(OB_W(tree%,j&)-(a%*z.b%))/2-1+((OB_TYPE(tree%,j&) DIV 256)-1)*z.b%
  1452.   ADD x&,z.b%*(i&-1)
  1453.   ADD y&,(OB_H(tree%,j&)+z.h%)/2-1
  1454.   IF @get_pixel(scr_handle%,x&,y&)>0
  1455.     vswr_mode(scr_handle%,3)
  1456.   ENDIF
  1457.   v_line(scr_handle%,x&,y&,x&+z.b%,y&)
  1458.   vswr_mode(scr_handle%,1)
  1459. RETURN
  1460. FUNCTION check_dialkey(tree%,key%,kstate%) ! auf SHORT-CUT prüfen
  1461.   .| Aufruf in : meinform_do-1,
  1462.   LOCAL a&,char&,i&,j&,scan%,keytbl%,type&,flg&,a$
  1463.   '
  1464.   CLR j&
  1465.   WHILE j&>=0
  1466.     flg&=OB_FLAGS(tree%,j&)
  1467.     IF (flg& AND 1024)>0                        ! FLAG 10?
  1468.       IF (OB_STATE(tree%,j&) AND 8)=0 AND ((flg& AND &H80)=0)
  1469.         type&=(OB_TYPE(tree%,j&) DIV 256)-1     ! x.Buchstabe
  1470.         '
  1471.         a$=CHAR{OB_SPEC(tree%,j&)}
  1472.         i&=1
  1473.         WHILE MID$(a$,i&,1)=" " AND i&<LEN(a$)
  1474.           INC i&
  1475.         WEND
  1476.         char&=BYTE{V:a$+i&-1+type&} OR &H20
  1477.         '
  1478.         keytbl%=XBIOS(16,L:-1,L:-1,L:-1)
  1479.         scan%=(key% DIV 256) AND &HFF
  1480.         IF (kstate% AND 3)>0            ! Shift-Taste
  1481.           a&=BYTE{{keytbl%+4}+scan%} OR &H20
  1482.         ELSE
  1483.           a&=BYTE{{keytbl%}+scan%}
  1484.         ENDIF
  1485.         IF char&=a& AND a&>0            ! Mit Taste vergleichen
  1486.           RETURN j&
  1487.         ENDIF
  1488.       ENDIF
  1489.     ENDIF
  1490.     IF (flg& AND &H20)>0    ! LASTOB
  1491.       RETURN -1
  1492.     ELSE
  1493.       INC j&
  1494.     ENDIF
  1495.   WEND
  1496.   '
  1497. ENDFUNC
  1498. '
  1499. FUNCTION form_do(tree%)
  1500.   .| Ruft auf  : meinform_do
  1501.   .| Aufruf in : do_input-1,alrt-1,setfont-1,hard_command-1,hard_part_sel-1
  1502.   .|     part_select-1,hard_param-1,sel_target_geraet-1,fdc_steprate-1
  1503.   .|     fdc_trackconfig-1,disass_konv-1,sektor_compare-1
  1504.   .|     set_kleine_buttons-1,disc_info-1,disc_drive-1,do_datei_info-1
  1505.   .|     ctrl_t-2,search-1,einname-1,eintext-1,infos-1,opt_konfig-1
  1506.   .|     einstellungen-1,opt_help-1,set_dma_mask-1,fat_bearbeiten-1,
  1507.   RETURN @meinform_do(tree%)
  1508. ENDFUNC
  1509. FUNCTION meinform_do(tree%)     ! eigene FORMDO Routine
  1510.   .| Glob. Var.: objc%,obj%,nextone%,key%,nextkey%,kstate%,type%,x%,y%,w%,h%
  1511.   .|     dx%,dy%,dw%,dh%,neu_x%,neu_y%
  1512.   .| Felder    : mem%()
  1513.   .| Ruft auf  : fm_inifld,form_keybd,check_dialkey,objc_update,kling,xywh
  1514.   .|     mem2scr,mnorm,scr2mem,init_button,draw_font
  1515.   .| Aufruf in : form_do-1,
  1516.   LOCAL which&,idx&,cont&,dummy%,mb%,edit_obj%,next_obj%
  1517.   LOCAL mx&,my&,mb&,ks&,key&,clicks&,ox%,oy%,hidden!,a%
  1518.   '
  1519.   ~GRAF_MOUSE(0,0)
  1520.   ~WIND_UPDATE(3)
  1521.   '
  1522.   next_obj%=@fm_inifld(tree%,objc%)
  1523.   CLR edit_obj%,obj%
  1524.   cont&=1
  1525.   '
  1526.   WHILE cont&
  1527.     IF (next_obj%<>0) AND (edit_obj%<>next_obj%)
  1528.       edit_obj%=next_obj%
  1529.       CLR next_obj%
  1530.       ~OBJC_EDIT(tree%,edit_obj%,0,idx&,1,idx&) ! EDINIT
  1531.     ENDIF
  1532.     '
  1533.     which&=EVNT_MULTI(&X11,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,mx&,my&,mb&,ks&,key&,clicks&)
  1534.     IF (which& AND 1)<>0                        ! TASTE gedrückt
  1535.       cont&=@form_keybd(tree%,edit_obj%,next_obj%,key&)
  1536.       next_obj%=nextone%
  1537.       key%=nextkey%
  1538.       kstate%=BIOS(11,-1)
  1539.       IF (kstate% AND 8)<>0
  1540.         a%=@check_dialkey(tree%,key%,kstate%)
  1541.         IF a%<>-1
  1542.           next_obj%=a%
  1543.           cont&=FORM_BUTTON(tree%,next_obj%,clicks&,next_obj%)
  1544.           objc_update(tree%,a%)                 ! Button neu zeichnen
  1545.         ENDIF
  1546.       ENDIF
  1547.       IF key%>0
  1548.         ~OBJC_EDIT(tree%,edit_obj%,key%,idx&,2,idx&)  ! EDCHAR
  1549.       ENDIF
  1550.       IF (next_obj%<>0) AND ((next_obj%<>edit_obj%) OR (cont&=0))
  1551.         ~OBJC_EDIT(tree%,edit_obj%,0,idx&,3,idx&)     ! EDEND
  1552.       ENDIF
  1553.     ENDIF
  1554.     IF (which& AND 2)>0                         ! KLICK (MOVE DIAL)
  1555.       next_obj%=OBJC_FIND(tree%,0,8,mx&,my&)
  1556.       IF next_obj%=-1
  1557.         kling
  1558.         CLR next_obj%
  1559.       ELSE
  1560.         type%=OB_TYPE(tree%,next_obj%)
  1561.         IF (type% DIV 256)=18                   ! Cross-Button
  1562.           OB_STATE(tree%,next_obj%)=OB_STATE(tree%,next_obj%) XOR 2
  1563.           objc_update(tree%,next_obj%)
  1564.         ENDIF
  1565.         IF (OB_FLAGS(tree%,next_obj%) AND &H15F)=0 AND (type% DIV 256<>30) OR (type% DIV 256=17)
  1566.           ' nicht selektierbares Objekt
  1567.           ' nicht EXIT/TOUCHEXIT/EDITABLE/RADIO/DEFAULT/INDIRECT
  1568.           ' kein Cross-Button
  1569.           IF mem%(0)>0
  1570.             ~OBJC_EDIT(tree%,edit_obj%,0,idx&,3,idx&)   ! EDEND
  1571.             xywh
  1572.             hidden!=FALSE
  1573.             IF ((mb& AND 2)=2) OR (ks& AND 8)<>0
  1574.               mem2scr(x%,y%,w%,h%)
  1575.               hidden!=TRUE
  1576.             ENDIF
  1577.             ox%=x%
  1578.             oy%=y%
  1579.             ~GRAF_MOUSE(4,0)
  1580.             ~GRAF_DRAGBOX(OB_W(tree%,0),OB_H(tree%,0),OB_X(tree%,0),OB_Y(tree%,0),dx%+3,dy%+3,dw%-6,dh%-6,neu_x%,neu_y%)
  1581.             mnorm
  1582.             IF ox%<>neu_x%-3 OR oy%<>neu_y%-3 OR hidden!=TRUE
  1583.               xywh
  1584.               mem2scr(x%,y%,w%,h%)
  1585.               OB_X(tree%,0)=neu_x%
  1586.               OB_Y(tree%,0)=neu_y%
  1587.               xywh
  1588.               scr2mem(x%,y%,w%,h%)
  1589.               ~OBJC_DRAW(tree%,0,8,dx%,dy%,dw%,dh%)
  1590.               init_button(tree%)                ! Unterstriche zeichnen
  1591.             ENDIF
  1592.             ~OBJC_EDIT(tree%,edit_obj%,0,idx&,1,idx&)
  1593.             '
  1594.             IF (OB_TYPE(tree%,0) DIV 256)=5     ! Spezial: FONT-Dialog
  1595.               draw_font
  1596.             ENDIF
  1597.             '
  1598.           ENDIF
  1599.           next_obj%=edit_obj%
  1600.         ELSE
  1601.           a%=next_obj%
  1602.           cont&=FORM_BUTTON(tree%,next_obj%,clicks&,next_obj%)
  1603.           IF (next_obj%<>0) AND ((next_obj%<>edit_obj%) OR (cont&=0))
  1604.             ~OBJC_EDIT(tree%,edit_obj%,0,idx&,3,idx&)   ! EDEND
  1605.           ENDIF
  1606.         ENDIF
  1607.       ENDIF
  1608.     ENDIF
  1609.   WEND
  1610.   '
  1611.   ~WIND_UPDATE(2)
  1612.   RETURN next_obj%
  1613. ENDFUNC
  1614. FUNCTION form_keybd(tree%,edit_obj&,next_obj&,key&)
  1615.   .| Glob. Var.: nextone%,nextkey%
  1616.   .| Aufruf in : meinform_do-1,
  1617.   {ADDRIN}=tree%
  1618.   CARD{GCONTRL}=55
  1619.   CARD{GCONTRL+2}=3
  1620.   CARD{GCONTRL+4}=3
  1621.   CARD{GCONTRL+6}=1
  1622.   CARD{GCONTRL+8}=0
  1623.   CARD{GINTIN}=edit_obj&
  1624.   CARD{GINTIN+2}=key&
  1625.   CARD{GINTIN+4}=next_obj&
  1626.   GEMSYS
  1627.   nextone%=CARD{GINTOUT+2}
  1628.   nextkey%=CARD{GINTOUT+4}
  1629.   RETURN CARD{GINTOUT}
  1630. ENDFUNC
  1631. FUNCTION find_obj(tree%,objc%,which&)
  1632.   .| Aufruf in : fm_inifld-1,
  1633.   LOCAL obj%,flag&,theflag&,inc&
  1634.   '
  1635.   CLR obj%
  1636.   flag&=8       ! EDITABLE
  1637.   inc&=1
  1638.   SELECT which&
  1639.   CASE -1
  1640.     inc&=-1
  1641.     obj%=objc%+inc&
  1642.   CASE 1
  1643.     obj%=objc%+inc&
  1644.   CASE 0
  1645.     flag&=2     ! DEFAULT
  1646.   ENDSELECT
  1647.   '
  1648.   WHILE obj%>=0
  1649.     theflag&=OB_FLAGS(tree%,obj%)
  1650.     IF (theflag& AND flag&)<>0
  1651.       RETURN obj%
  1652.     ENDIF
  1653.     IF (theflag& AND &H20)<>0       ! LASTOB
  1654.       obj%=-1
  1655.     ELSE
  1656.       obj%=obj%+inc&
  1657.     ENDIF
  1658.   WEND
  1659.   RETURN objc%
  1660. ENDFUNC
  1661. FUNCTION fm_inifld(tree%,objc&)
  1662.   .| Ruft auf  : find_obj
  1663.   .| Aufruf in : meinform_do-1,
  1664.   IF objc&=0
  1665.     objc&=@find_obj(tree%,0,1)  ! FMD_FORWARD
  1666.   ENDIF
  1667.   RETURN objc&
  1668. ENDFUNC
  1669. FUNCTION menu_search(ap_id%,mtree%,kstate%,key%)
  1670.   .| Glob. Var.: mes_adr%
  1671.   .| Aufruf in : taste-2,
  1672.   LOCAL mtitle%,ctitle%,mentry%,centry%,typ%,schluss!,zeichen$
  1673.   LOCAL scan%,desk%,keytbl%,su$
  1674.   '
  1675.   keytbl%=XBIOS(16,L:-1,L:-1,L:-1)
  1676.   '
  1677.   ~WIND_UPDATE(1)       !!
  1678.   ~WIND_UPDATE(0)
  1679.   '
  1680.   schluss!=FALSE
  1681.   CLR desk%
  1682.   scan%=(key% DIV 256) AND &HFF
  1683.   '
  1684.   IF (kstate% AND 3)<>0         ! Shift-Taste
  1685.     zeichen$=UPPER$(CHR$(BYTE{{keytbl%}+scan%}))
  1686.   ELSE
  1687.     zeichen$=UPPER$(CHR$(BYTE{{keytbl%}+scan%}))
  1688.   ENDIF
  1689.   '
  1690.   IF (kstate% AND 8)<>0         ! ALT gedrückt
  1691.     su$="◆"
  1692.   ELSE
  1693.     IF (kstate% AND 4)<>0       ! CTRL
  1694.       su$="^"                   ! "^"+Taste
  1695.     ELSE
  1696.       schluss!=TRUE             ! Nix
  1697.     ENDIF
  1698.   ENDIF
  1699.   su$=su$+zeichen$
  1700.   '
  1701.   mtitle%=OB_HEAD(mtree%,OB_HEAD(mtree%,0))
  1702.   ctitle%=OB_HEAD(mtree%,mtitle%)
  1703.   mentry%=OB_HEAD(mtree%,OB_TAIL(mtree%,0))
  1704.   centry%=OB_HEAD(mtree%,mentry%)
  1705.   '
  1706.   WHILE NOT schluss!
  1707.     IF (OB_STATE(mtree%,ctitle%) AND 8)=0       ! DISABLED
  1708.       WHILE (NOT schluss!) AND (centry%<>mentry%) AND (centry%<>-1)
  1709.         IF (OB_STATE(mtree%,centry%) AND 8)=0   ! DISABLED
  1710.           typ%=OB_TYPE(mtree%,centry%)
  1711.           IF typ%=28 OR typ%=26                 ! G_STRING oder G_BUTTON
  1712.             schluss!=INSTR(CHAR{OB_SPEC(mtree%,centry%)},su$)
  1713.           ENDIF
  1714.         ENDIF
  1715.         '
  1716.         IF schluss!=TRUE
  1717.           CARD{mes_adr%}=10     ! MN_SELECTED
  1718.           CARD{mes_adr%+2}=ap_id%
  1719.           CARD{mes_adr%+4}=0
  1720.           CARD{mes_adr%+6}=ctitle%
  1721.           CARD{mes_adr%+8}=centry%
  1722.           ~MENU_TNORMAL(mtree%,ctitle%,0)
  1723.           ~APPL_WRITE(ap_id%,16,mes_adr%)
  1724.           RETURN 1              ! Suche war erfolgreich
  1725.         ENDIF
  1726.         '
  1727.         centry%=OB_NEXT(mtree%,centry%)
  1728.         IF desk%=0
  1729.           centry%=mentry%
  1730.           desk%=1
  1731.         ENDIF
  1732.       WEND
  1733.     ENDIF
  1734.     ctitle%=OB_NEXT(mtree%,ctitle%)
  1735.     mentry%=OB_NEXT(mtree%,mentry%)
  1736.     centry%=OB_HEAD(mtree%,mentry%)
  1737.     IF ctitle%=mtitle%
  1738.       schluss!=TRUE
  1739.     ENDIF
  1740.   WEND
  1741.   RETURN 0
  1742. ENDFUNC
  1743. '
  1744. PROCEDURE trans_gimage(tree%,obj%)
  1745.   .| Ruft auf  : vdi_trans
  1746.   .| Aufruf in : set_rsc-1,
  1747.   LOCAL type%,wb%,hl%,ib%,taddr%
  1748.   '
  1749.   SELECT OB_TYPE(tree%,obj%)
  1750.   CASE 31                       ! G_ICON
  1751.     ib%=OB_SPEC(tree%,obj%)
  1752.     taddr%={ib%}
  1753.     wb%=CARD{ib%+22} DIV 8     ! Breite ib_wicon
  1754.     hl%=CARD{ib%+24}           ! Höhe ib_hicon
  1755.     vdi_trans(taddr%,wb%,taddr%,wb%,hl%)
  1756.     taddr%={ib%+4}
  1757.   CASE 23                       ! G_IMAGE
  1758.     ib%=OB_SPEC(tree%,obj%)
  1759.     taddr%={ib%}
  1760.     wb%=CARD{ib%+4}
  1761.     hl%=CARD{ib%+6}
  1762.   ENDSELECT
  1763.   vdi_trans(taddr%,wb%,taddr%,wb%,hl%)
  1764. RETURN
  1765. PROCEDURE vdi_trans(saddr%,swb%,daddr%,dwb%,h%)
  1766.   .| Glob. Var.: scr_handle%
  1767.   .| Ruft auf  : vdi_fix,vr_trnfm
  1768.   .| Aufruf in : trans_gimage-2,
  1769.   LOCAL src$,dst$
  1770.   src$=STRING$(50,0)
  1771.   dst$=STRING$(50,0)            ! Platz für MFDBs
  1772.   vdi_fix(VARPTR(src$),saddr%,swb%,h%)
  1773.   CARD{VARPTR(src$)+10}=1       ! Standardformat
  1774.   vdi_fix(VARPTR(dst$),daddr%,dwb%,h%)
  1775.   CARD{VARPTR(src$)+10}=0       ! Geräteabhängiges Format
  1776.   vr_trnfm(scr_handle%,VARPTR(src$),VARPTR(dst$))
  1777.   CLR src$,dst$
  1778. RETURN
  1779. PROCEDURE vdi_fix(pfd%,theaddr%,wb%,h%)
  1780.   .| Aufruf in : vdi_trans-2,
  1781.   {pfd%}=theaddr%
  1782.   CARD{pfd%+4}=wb%*8
  1783.   CARD{pfd%+6}=h%
  1784.   CARD{pfd%+8}=wb%/2
  1785.   CARD{pfd%+12}=1
  1786. RETURN
  1787. ' ---------------------- VDI -----------------------------
  1788. PROCEDURE v_enter_cur(handle%)                  ! VDI 5
  1789.   .| Aufruf in : do_pexec-1,start_shell-1,
  1790.   CARD{CONTRL}=5
  1791.   CARD{CONTRL+2}=0
  1792.   CARD{CONTRL+6}=0
  1793.   CARD{CONTRL+10}=3
  1794.   CARD{CONTRL+12}=handle%
  1795.   VDISYS
  1796. RETURN
  1797. PROCEDURE v_exit_cur(handle%)                   ! VDI 5
  1798.   .| Aufruf in : do_pexec-2,start_shell-1,
  1799.   CARD{CONTRL}=5
  1800.   CARD{CONTRL+2}=0
  1801.   CARD{CONTRL+6}=0
  1802.   CARD{CONTRL+10}=2
  1803.   CARD{CONTRL+12}=handle%
  1804.   VDISYS
  1805. RETURN
  1806. PROCEDURE v_line(handle%,x%,y%,x2%,y2%)         ! VDI 6
  1807.   .| Aufruf in : init_button-1,draw_underline-1,out_lined_cursor-4
  1808.   .|     redraw_list-2,do_pexec-1,
  1809.   CARD{CONTRL}=6
  1810.   CARD{CONTRL+2}=2
  1811.   {CONTRL+4}=0
  1812.   CARD{CONTRL+8}=0
  1813.   CARD{CONTRL+12}=handle%
  1814.   CARD{PTSIN}=x%
  1815.   CARD{PTSIN+2}=y%
  1816.   CARD{PTSIN+4}=x2%
  1817.   CARD{PTSIN+6}=y2%
  1818.   VDISYS
  1819. RETURN
  1820. PROCEDURE vst_rotation(handle%,winkel%)         ! VDI 13
  1821.   .| Aufruf in : v_opnvwk-1,
  1822.   CARD{CONTRL}=13
  1823.   CARD{CONTRL+2}=0
  1824.   CARD{CONTRL+6}=1
  1825.   CARD{CONTRL+12}=handle%
  1826.   CARD{INTIN}=winkel%
  1827.   VDISYS
  1828. RETURN
  1829. PROCEDURE vst_font(handle%,font%)               ! VDI 21
  1830.   .| Aufruf in : v_opnvwk-1,init_font-1,setfont-3,
  1831.   CARD{INTIN}=font%
  1832.   CARD{CONTRL}=21
  1833.   {CONTRL+2}=0
  1834.   CARD{CONTRL+6}=1
  1835.   CARD{CONTRL+8}=1
  1836.   CARD{CONTRL+12}=handle%
  1837.   VDISYS
  1838. RETURN
  1839. PROCEDURE vst_color(handle%,colindex%)          ! VDI 22
  1840.   .| Aufruf in : v_opnvwk-1,
  1841.   CARD{CONTRL}=22
  1842.   CARD{CONTRL+2}=0
  1843.   CARD{CONTRL+6}=1
  1844.   CARD{CONTRL+12}=handle%
  1845.   CARD{INTIN}=colindex%
  1846.   VDISYS
  1847. RETURN
  1848. PROCEDURE vsf_interior(handle%,style%)          ! VDI 23
  1849.   .| Aufruf in : v_opnvwk-1,
  1850.   CARD{CONTRL}=23
  1851.   CARD{CONTRL+2}=0
  1852.   CARD{CONTRL+6}=1
  1853.   CARD{CONTRL+12}=handle%
  1854.   CARD{INTIN}=style%
  1855.   VDISYS
  1856. RETURN
  1857. PROCEDURE vsf_style(handle%,style_index%)       ! VDI 24
  1858.   .| Aufruf in : v_opnvwk-1,
  1859.   CARD{CONTRL}=24
  1860.   CARD{CONTRL+2}=0
  1861.   CARD{CONTRL+6}=1
  1862.   CARD{CONTRL+12}=handle%
  1863.   CARD{INTIN}=style_index%
  1864.   VDISYS
  1865. RETURN
  1866. PROCEDURE vsf_color(handle%,color_index%)       ! VDI 25
  1867.   .| Aufruf in : v_opnvwk-1,
  1868.   CARD{CONTRL}=25
  1869.   CARD{CONTRL+2}=0
  1870.   CARD{CONTRL+6}=1
  1871.   CARD{CONTRL+12}=handle%
  1872.   CARD{INTIN}=color_index%
  1873.   VDISYS
  1874. RETURN
  1875. PROCEDURE vswr_mode(handle%,mode%)              ! VDI 32
  1876.   .| Aufruf in : draw_underline-2,v_opnvwk-1,out_lined_cursor-2,
  1877.   CARD{INTIN}=mode%
  1878.   CARD{CONTRL}=32
  1879.   CARD{CONTRL+2}=0
  1880.   CARD{CONTRL+6}=1
  1881.   CARD{CONTRL+12}=handle%
  1882.   VDISYS
  1883. RETURN
  1884. PROCEDURE vst_alignment(handle%,horin%,vertin%) ! VDI 39
  1885.   .| Aufruf in : v_opnvwk-1,
  1886.   CARD{INTIN}=horin%
  1887.   CARD{INTIN+2}=vertin%
  1888.   CARD{CONTRL}=39
  1889.   CARD{CONTRL+2}=0
  1890.   CARD{CONTRL+6}=2
  1891.   CARD{CONTRL+12}=handle%
  1892.   VDISYS
  1893. RETURN
  1894. PROCEDURE v_opnvwk                              ! VDI 100
  1895.   .| Glob. Var.: graf_handle%,scr_width%,scr_height%,scr_handle%,fonts%
  1896.   .|     neuefonts%,sed_pfad$
  1897.   .| Ruft auf  : set_pfad,vswr_mode,vst_color,vst_font,vst_effects
  1898.   .|     vst_alignment,vsf_interior,vst_rotation,vsf_style,vsf_color
  1899.   .| Aufruf in : rsc_init-1,
  1900.   CARD{CONTRL}=100
  1901.   CARD{CONTRL+2}=0
  1902.   CARD{CONTRL+4}=6
  1903.   CARD{CONTRL+6}=11
  1904.   CARD{CONTRL+8}=45
  1905.   CARD{CONTRL+12}=graf_handle%
  1906.   '
  1907.   CARD{INTIN}=1         ! Bildschirmtreiber, aktuelle Auflösung
  1908.   CARD{INTIN+2}=1       ! Linientyp
  1909.   CARD{INTIN+4}=1       ! Linienfarbe
  1910.   CARD{INTIN+6}=1       ! Markertyp
  1911.   CARD{INTIN+8}=1       ! Markerfarbe
  1912.   CARD{INTIN+10}=1      ! Textstil
  1913.   CARD{INTIN+12}=1      ! Textfarbe
  1914.   CARD{INTIN+14}=1      ! Fülltyp
  1915.   CARD{INTIN+16}=1      ! Füllmuster-Index
  1916.   CARD{INTIN+18}=1      ! Füllmuster-Farbe
  1917.   CARD{INTIN+20}=2      ! RC-Koordinaten
  1918.   VDISYS
  1919.   scr_width%=CARD{INTOUT}+1
  1920.   scr_height%=CARD{INTOUT+2}+1
  1921.   scr_handle%=CARD{CONTRL+12}
  1922.   fonts%=CARD{INTOUT+20}
  1923.   IF GDOS?
  1924.     neuefonts%=VST_LOAD_FONTS(0)                ! Fonts laden
  1925.     set_pfad(sed_pfad$)                         ! Pfad korrigieren
  1926.   ENDIF
  1927.   '
  1928.   ' gleich alle Texteigenschaften einstellen
  1929.   vswr_mode(scr_handle%,1)      ! Replace-Modus
  1930.   vst_color(scr_handle%,1)      ! Farbe Schwarz
  1931.   vst_font(scr_handle%,1)       ! Systemzeichensatz
  1932.   vst_effects(scr_handle%,0)    ! Normal
  1933.   vst_alignment(scr_handle%,0,3)! Linksbündig, Zellenunterkante
  1934.   vsf_interior(scr_handle%,1)   ! Fülltyp
  1935.   vst_rotation(scr_handle%,0)   ! Winkel 0
  1936.   vsf_style(scr_handle%,0)      ! Musterindex
  1937.   vsf_color(scr_handle%,0)      !
  1938. RETURN
  1939. PROCEDURE v_clsvwk(handle%)                     ! VDI 101
  1940.   .| Aufruf in : do_exit-1,
  1941.   CARD{CONTRL}=101
  1942.   CARD{CONTRL+2}=0
  1943.   CARD{CONTRL+6}=0
  1944.   CARD{CONTRL+12}=handle%
  1945.   VDISYS
  1946. RETURN
  1947. FUNCTION vq_extnd(handle%,flag%)                ! VDI 102
  1948.   .| Aufruf in : rsc_init-1,
  1949.   CARD{CONTRL}=102
  1950.   CARD{CONTRL+2}=0
  1951.   CARD{CONTRL+4}=6
  1952.   CARD{CONTRL+6}=1
  1953.   CARD{CONTRL+8}=45
  1954.   CARD{CONTRL+12}=handle%
  1955.   CARD{INTIN}=flag%
  1956.   VDISYS
  1957.   RETURN CARD{INTOUT+8}
  1958. ENDFUNC
  1959. FUNCTION get_pixel(handle%,x%,y%)               ! VDI 105
  1960.   .| Aufruf in : draw_underline-1,
  1961.   CARD{PTSIN}=x%
  1962.   CARD{PTSIN+2}=y%
  1963.   CARD{CONTRL}=105
  1964.   CARD{CONTRL+2}=1
  1965.   CARD{CONTRL+6}=0
  1966.   CARD{CONTRL+12}=handle%
  1967.   VDISYS
  1968.   RETURN CARD{INTOUT}
  1969. ENDFUNC
  1970. PROCEDURE vst_effects(handle%,effect%)          ! VDI 106
  1971.   .| Aufruf in : v_opnvwk-1,
  1972.   CARD{INTIN}=effect%
  1973.   CARD{CONTRL}=106
  1974.   CARD{CONTRL+2}=0
  1975.   CARD{CONTRL+6}=1
  1976.   CARD{CONTRL+12}=handle%
  1977.   VDISYS
  1978. RETURN
  1979. FUNCTION vst_point(handle%,point%)              ! VDI 107
  1980.   .| Glob. Var.: z.breite%,z.hoehe%
  1981.   .| Aufruf in : rsc_init-1,init_font-1,setfont-4,
  1982.   CARD{INTIN}=point%
  1983.   CARD{CONTRL}=107
  1984.   CARD{CONTRL+2}=0
  1985.   CARD{CONTRL+4}=2
  1986.   CARD{CONTRL+6}=1
  1987.   CARD{CONTRL+8}=1
  1988.   CARD{CONTRL+12}=handle%
  1989.   VDISYS
  1990.   z.breite%=CARD{PTSOUT+4}
  1991.   z.hoehe%=CARD{PTSOUT+6}
  1992.   RETURN CARD{INTOUT}
  1993. ENDFUNC
  1994. PROCEDURE vr_trnfm(handle%,src%,dst%)           ! VDI 110
  1995.   .| Aufruf in : vdi_trans-1,
  1996.   CARD{CONTRL}=110
  1997.   {CONTRL+2}=0
  1998.   {CONTRL+6}=0
  1999.   CARD{CONTRL+12}=handle%
  2000.   {CONTRL+14}=src%
  2001.   {CONTRL+18}=dst%
  2002.   VDISYS
  2003. RETURN
  2004. PROCEDURE vr_recfl(handle%,x%,y%,x2%,y2%)       ! VDI 114
  2005.   .| Aufruf in : draw_font-1,wind_open-1,wind_clr-1,redraw_list-2,
  2006.   CARD{CONTRL}=114
  2007.   CARD{CONTRL+2}=2
  2008.   CARD{CONTRL+6}=0
  2009.   CARD{CONTRL+12}=handle%
  2010.   CARD{PTSIN}=x%
  2011.   CARD{PTSIN+2}=y%
  2012.   CARD{PTSIN+4}=x%+x2%-1
  2013.   CARD{PTSIN+6}=y%+y2%-1
  2014.   VDISYS
  2015. RETURN
  2016. FUNCTION vqt_width(handle%,zeichen%)            ! VDI 117
  2017.   .| Aufruf in : chkfont-2, (tot)
  2018.   CARD{CONTRL}=117
  2019.   CARD{CONTRL+2}=0
  2020.   CARD{CONTRL+4}=3
  2021.   CARD{CONTRL+6}=1
  2022.   CARD{CONTRL+8}=1
  2023.   CARD{CONTRL+12}=handle%
  2024.   CARD{INTIN}=zeichen%
  2025.   VDISYS
  2026.   RETURN CARD{PTSOUT}
  2027. ENDFUNC
  2028. PROCEDURE vs_clip(handle%,flag%,x%,y%,x2%,y2%)  ! VDI 129
  2029.   .| Aufruf in : draw_font-2,out_lined_cursor-2,wind_open-1,wind_clr-2
  2030.   .|     redraw_list-2,zeile-2,text_line-2,redraw_desk-2,do_pexec-1,
  2031.   CARD{CONTRL}=129
  2032.   CARD{CONTRL+2}=2
  2033.   CARD{CONTRL+6}=1
  2034.   CARD{CONTRL+12}=handle%
  2035.   CARD{PTSIN}=x%
  2036.   CARD{PTSIN+2}=y%
  2037.   CARD{PTSIN+4}=x%+x2%-1
  2038.   CARD{PTSIN+6}=y%+y2%-1
  2039.   CARD{INTIN}=flag%
  2040.   VDISYS
  2041. RETURN
  2042. FUNCTION vqt_name(handle%,fontnr%,VAR fontname$) ! VDI 130
  2043.   .| Aufruf in : init_font-1,
  2044.   RETURN VQT_NAME(fontnr%,fontname$)
  2045. ENDFUNC
  2046. PROCEDURE vqt_fontinfo(handle%,VAR minad%,maxad%) ! VDI 131
  2047.   .| Aufruf in : chkfont-1,init_font-1,
  2048.   CARD{CONTRL}=131
  2049.   CARD{CONTRL+2}=0
  2050.   CARD{CONTRL+4}=5
  2051.   CARD{CONTRL+6}=0
  2052.   CARD{CONTRL+8}=2
  2053.   CARD{CONTRL+12}=handle%
  2054.   VDISYS
  2055.   minad%=CARD{INTOUT}
  2056.   maxad%=CARD{INTOUT+2}
  2057. RETURN
  2058. '
  2059. FUNCTION chkfont      ! nachsehen ob alle Zeichen gleich breit
  2060.   .| Glob. Var.: scr_handle%
  2061.   .| Ruft auf  : vqt_fontinfo,vqt_width (tot)
  2062.   LOCAL i%,width%,minad%,maxad%
  2063.   '
  2064.   vqt_fontinfo(scr_handle%,minad%,maxad%)       ! first+last CHR holen
  2065.   width%=@vqt_width(scr_handle%,minad%)
  2066.   '
  2067.   FOR i%=minad%+1 TO maxad%-1
  2068.     IF width%<>@vqt_width(scr_handle%,i%)
  2069.       RETURN 1
  2070.     ENDIF
  2071.   NEXT i%
  2072.   RETURN 0
  2073. ENDFUNC
  2074. '
  2075. PROCEDURE init_font(font$,fontsx%)
  2076.   .| Glob. Var.: fonts%,neuefonts%,scr_handle%,fontname$,aktfontnr%,fontsz%
  2077.   .|     minad%,maxad%
  2078.   .| Ruft auf  : vqt_name,vst_font,vst_point,alrt,vqt_fontinfo,set_vdipar
  2079.   .| Aufruf in : rsc_init-1,setfont-1,
  2080.   LOCAL fontnr%,a%
  2081.   fontnr%=1
  2082.   '
  2083.   WHILE fontnr%<=fonts%+neuefonts%              ! Font suchen
  2084.     a%=@vqt_name(scr_handle%,fontnr%,fontname$)
  2085.     EXIT IF TRIM$(fontname$)=TRIM$(font$)
  2086.     INC fontnr%
  2087.   WEND
  2088.   '
  2089.   IF fontnr%<=fonts%+neuefonts%                 ! Font gefunden?
  2090.     vst_font(scr_handle%,a%)                    ! Ja, Font einschalten
  2091.     a%=@vst_point(scr_handle%,fontsx%)          ! die Größe dazu
  2092.     IF a%<>fontsx%                              ! hat geklappt?
  2093.       ~@alrt(3,"Fontgröße "+STR$(fontsx%)+" nicht einstellbar!",1,"Aha")
  2094.     ENDIF
  2095.   ELSE
  2096.     ~@alrt(3,"Font: "+font$+" | nicht geladen!",1,"Aha")
  2097.   ENDIF
  2098.   aktfontnr%=fontnr%
  2099.   fontsz%=fontsx%
  2100.   fontname$=font$
  2101.   vqt_fontinfo(scr_handle%,minad%,maxad%)       ! first+last CHR
  2102.   set_vdipar                                    ! ...
  2103. RETURN
  2104. PROCEDURE setfont
  2105.   .| Glob. Var.: aktfontnr%,fontsz%,fontsx%,scr_handle%,fontname$,f.ontdial%
  2106.   .|     fontname&,fontsize&,fontall&,fontok&,fontwael&,fontabb&,fontmin&
  2107.   .|     fontsp&,fontsm&,fonts%,neuefonts%,font_soll$
  2108.   .| Ruft auf  : vst_font,put_char,box_draw,vst_point,objc_update,set_state
  2109.   .|     clr_state,draw_font,form_do,box_undraw,init_font,set_vdipar
  2110.   .|     desktop_weg,desktop_back
  2111.   .| Aufruf in : einstellungen-1,
  2112.   LOCAL a%,a$,x%,y%,w%,h%,ex_obj&,fontnr%,font_prop%
  2113.   '
  2114.   fontnr%=aktfontnr%
  2115.   fontsz%=fontsx%
  2116.   vst_font(scr_handle%,VQT_NAME(fontnr%,fontname$))
  2117.   put_char(f.ontdial%,fontname&,LEFT$(fontname$+STRING$(33," "),33))
  2118.   put_char(f.ontdial%,fontsize&,LEFT$(STR$(fontsz%)+" ",2))
  2119.   box_draw(f.ontdial%)
  2120.   DO
  2121.     vst_font(scr_handle%,VQT_NAME(fontnr%,fontname$))
  2122.     put_char(f.ontdial%,fontname&,LEFT$(fontname$+STRING$(33," "),33))
  2123.     a%=@vst_point(scr_handle%,fontsz%)
  2124.     IF a%<=fontsz%
  2125.       fontsz%=a%
  2126.     ENDIF
  2127.     '
  2128.     IF (OB_STATE(f.ontdial%,fontall&) AND 1) OR font_prop%=0
  2129.       put_char(f.ontdial%,fontsize&,LEFT$(STR$(fontsz%)+" ",2))
  2130.       objc_update(f.ontdial%,fontsize&)
  2131.       objc_update(f.ontdial%,fontname&)
  2132.       IF font_prop%>0
  2133.         set_state(f.ontdial%,fontok&,8)   ! nicht wählbar
  2134.       ELSE
  2135.         clr_state(f.ontdial%,fontok&,8)
  2136.       ENDIF
  2137.       objc_update(f.ontdial%,fontok&)
  2138.       draw_font
  2139.       ex_obj&=@form_do(f.ontdial%) AND &HFF
  2140.       IF ex_obj&<>fontall& AND ex_obj&<>fontwael&
  2141.         clr_state(f.ontdial%,ex_obj&,1)
  2142.       ENDIF
  2143.       objc_update(f.ontdial%,ex_obj&)
  2144.       EXIT IF ex_obj&=fontok& OR ex_obj&=fontabb&
  2145.     ELSE
  2146.       ex_obj&=fontmin&
  2147.     ENDIF
  2148.     '
  2149.     SELECT ex_obj&
  2150.     CASE fontsp&
  2151.       REPEAT                    ! Size +
  2152.         INC fontsz%
  2153.         a%=@vst_point(scr_handle%,fontsz%)
  2154.       UNTIL a%>=fontsz% OR fontsz%=99
  2155.       fontsz%=a%
  2156.     CASE fontsm&
  2157.       DEC fontsz%               ! Size -
  2158.       a%=@vst_point(scr_handle%,fontsz%)
  2159.       IF a%<=fontsz%
  2160.         fontsz%=a%
  2161.       ELSE
  2162.         INC fontsz%
  2163.       ENDIF
  2164.     CASE fontmin&
  2165.       INC fontnr%               ! Font +
  2166.       fontsz%=100
  2167.       IF fontnr%>fonts%+neuefonts%
  2168.         fontnr%=1
  2169.       ENDIF
  2170.       vst_font(scr_handle%,VQT_NAME(fontnr%,fontname$))
  2171.       DO
  2172.         DEC fontsz%
  2173.         a%=@vst_point(scr_handle%,fontsz%)
  2174.         IF a%<=fontsz%
  2175.           fontsz%=a%
  2176.           EXIT IF fontsz%<=10
  2177.         ELSE
  2178.           INC fontsz%
  2179.           EXIT IF -1
  2180.         ENDIF
  2181.       LOOP
  2182.     ENDSELECT
  2183.   LOOP
  2184.   box_undraw(f.ontdial%)
  2185.   IF ex_obj&=fontabb&
  2186.     init_font(font_soll$,fontsx%)
  2187.   ELSE
  2188.     font_soll$=fontname$
  2189.     fontsx%=fontsz%
  2190.     aktfontnr%=fontnr%
  2191.     set_vdipar
  2192.     desktop_weg
  2193.     desktop_back
  2194.   ENDIF
  2195. RETURN
  2196. PROCEDURE draw_font
  2197.   .| Glob. Var.: f.ontdial%,fonttest&,x%,y%,w%,h%,scr_handle%,z.hoehe%
  2198.   .|     fontname$
  2199.   .| Ruft auf  : vs_clip,vr_recfl,v_gtext
  2200.   .| Aufruf in : meinform_do-1,setfont-1,
  2201.   ~OBJC_OFFSET(f.ontdial%,fonttest&,x%,y%)
  2202.   w%=OB_W(f.ontdial%,fonttest&)
  2203.   h%=OB_H(f.ontdial%,fonttest&)
  2204.   vs_clip(scr_handle%,1,x%,y%,w%,h%)
  2205.   ~WIND_UPDATE(1)
  2206.   ~GRAF_MOUSE(256,0)
  2207.   vr_recfl(scr_handle%,x%,y%,w%,h%)
  2208.   v_gtext(x%+1,y%+z.hoehe%,fontname$)
  2209.   ~GRAF_MOUSE(257,0)
  2210.   ~WIND_UPDATE(0)
  2211.   vs_clip(scr_handle%,0,0,0,0,0)
  2212. RETURN
  2213. PROCEDURE v_gtext(x%,y%,a$)
  2214.   .| Glob. Var.: vdi_par%,zeile%
  2215.   .| Aufruf in : draw_font-1,redraw_list-2,do_pexec-1,
  2216.   IF LEN(a$)>0
  2217.     {vdi_par%}=VARPTR(a$)
  2218.     ~C:zeile%(1,L:vdi_par%,x%,y%,MIN(255,LEN(a$)),0,0)
  2219.     '         Op,Strukt,   x-,y-,Spalten
  2220.   ENDIF
  2221. RETURN
  2222. PROCEDURE set_vdipar          ! Konstanten für VDI-Ausgabe
  2223.   .| Glob. Var.: vdi_par%,scr_handle%,z.hoehe%,z.breite%,minad%,maxad%,dec%
  2224.   .| Aufruf in : init_font-1,setfont-1,wind_set-1,check_vor-1,
  2225.   CARD{vdi_par%+12}=scr_handle%
  2226.   CARD{vdi_par%+14}=z.hoehe%    ! Zeichenzellenhöhe
  2227.   CARD{vdi_par%+16}=z.breite%   !    "         breite
  2228.   CARD{vdi_par%+18}=minad%      ! first CHR im Font
  2229.   CARD{vdi_par%+20}=maxad%      ! last  CHR
  2230.   CARD{vdi_par%+22}=dec%        ! HEX-DEC-Anzeige?
  2231. RETURN
  2232. ' ---------------------- Diverses ------------------------------
  2233. PROCEDURE init_do             ! xxx.INF lesen
  2234.   .| Glob. Var.: sed_inf$,ver$,fhandle%,fll%,buf$,dum%,default%,max.text%,dec%
  2235.   .|     dial.pos%,cursor_rate%,s.ammeln%,tabs%,target%,f.eedcode%,f.eed%
  2236.   .|     s.lider%,t.xtsavm%,drive%,cr$,font_soll$,fontsx%,inf_ma$
  2237.   .| Felder    : fe%(),hd_typ%(),dma%(),frei%()
  2238.   .| Ruft auf  : fsel$,fopen,fseek,fread$,fclose,get_str,init_help
  2239.   .| Aufruf in : HAUPTPROGRAMM-1,
  2240.   LOCAL a%,ab%,i&,fi$,a$,b$
  2241.   '
  2242.   fi$=sed_inf$+STRING$(128,0)
  2243.   a%=SHEL_FIND(fi$)
  2244.   b$=ver$+".INF"
  2245.   '
  2246.   WHILE (NOT EXIST(fi$)) AND a%=0
  2247.     fi$=@fsel$("*.INF",b$,"suche "+sed_inf$,1)
  2248.     EXIT IF EXIST(fi$) OR fi$=""
  2249.   WEND
  2250.   '
  2251.   IF EXIST(fi$)=TRUE
  2252.     fhandle%=@fopen(fi$,0)
  2253.     IF fhandle%>0
  2254.       fll%=@fseek(0,fhandle%,2)
  2255.       IF fll%<32760
  2256.         ~@fseek(0,fhandle%,0)
  2257.         buf$=@fread$(fhandle%,fll%)     ! alles lesen
  2258.         ~@fclose(fhandle%)
  2259.       ELSE
  2260.         ALERT 3,"INF-Datei zu lang!|Installiere DEFAULT.INF.",1," Aha ",dum%
  2261.         buf$=STRING$(512,0)
  2262.         BMOVE default%,V:buf$,512
  2263.       ENDIF
  2264.     ENDIF
  2265.   ELSE
  2266.     buf$=STRING$(512,0)
  2267.     BMOVE default%,V:buf$,512
  2268.     ALERT 1,"Installiere DEFAULT.INF.",1," Aha ",dum%
  2269.   ENDIF
  2270.   '
  2271.   ab%=1
  2272.   fe%(0,1)=@get_str(ab%)        ! Datenfenster
  2273.   fe%(0,2)=@get_str(ab%)
  2274.   fe%(0,3)=@get_str(ab%)
  2275.   fe%(0,4)=@get_str(ab%)
  2276.   '
  2277.   max.text%=MAX(500,@get_str(ab%))
  2278.   dec%=@get_str(ab%)
  2279.   dial.pos%=@get_str(ab%)
  2280.   cursor_rate%=@get_str(ab%)
  2281.   s.ammeln%=@get_str(ab%)
  2282.   tabs%=@get_str(ab%)
  2283.   target%=@get_str(ab%)
  2284.   f.eedcode%=@get_str(ab%)
  2285.   f.eed%=@get_str(ab%)
  2286.   s.lider%=@get_str(ab%)
  2287.   t.xtsavm%=@get_str(ab%)
  2288.   drive%=@get_str(ab%)
  2289.   '
  2290.   FOR i&=0 TO 7
  2291.     hd_typ%(i&)=@get_str(ab%)
  2292.   NEXT i&
  2293.   FOR i&=0 TO 31
  2294.     dma%(i&)=@get_str(ab%)
  2295.   NEXT i&
  2296.   a%=INSTR(ab%,buf$,cr$)
  2297.   font_soll$=LEFT$(MID$(buf$,ab%,a%-ab%)+STRING$(32,32),32)  ! Fontname lesen
  2298.   IF INSTR(font_soll$,CHR$(0)) ! Nullbytes "konvertieren"
  2299.     font_soll$=LEFT$(CHAR{V:font_soll$}+STRING$(32,32),32)
  2300.   ENDIF
  2301.   ab%=a%+2
  2302.   fontsx%=@get_str(ab%)
  2303.   '
  2304.   fe%(1,1)=@get_str(ab%)
  2305.   fe%(1,2)=@get_str(ab%)
  2306.   fe%(1,3)=@get_str(ab%)
  2307.   fe%(1,4)=@get_str(ab%)
  2308.   '
  2309.   FOR i&=1 TO 14                ! 14 kleine Buttons
  2310.     frei%(i&,0)=@get_str(ab%)
  2311.     frei%(i&,1)=@get_str(ab%)
  2312.     frei%(i&,2)=@get_str(ab%)
  2313.   NEXT i&
  2314.   IF (BIOS(10) AND 2^drive%)=0
  2315.     CLR drive%
  2316.   ENDIF
  2317.   inf_ma$=MID$(buf$,ab%,14*5)
  2318.   CLR buf$
  2319.   init_help
  2320. RETURN
  2321. PROCEDURE save_einstellungen  ! xxx.INF schreiben
  2322.   .| Glob. Var.: sed_inf$,sed_inf2$,dw%,dh%,max.text%,dec%,dial.pos%
  2323.   .|     cursor_rate%,s.ammeln%,tabs%,target%,f.eedcode%,f.eed%,s.lider%
  2324.   .|     t.xtsavm%,drive%,fontname$,fontsz%,inf_ma$
  2325.   .| Felder    : fe%(),hd_typ%(),dma%(),frei%()
  2326.   .| Ruft auf  : mtasse,frename,fcreate,fwritec,fclose,mnorm
  2327.   .| Aufruf in : einstellungen-1,
  2328.   LOCAL i&,hdl%,x%,y%
  2329.   '
  2330.   mtasse
  2331.   IF EXIST(sed_inf$)=TRUE AND EXIST(sed_inf2$)=FALSE
  2332.     ~@frename(sed_inf$,sed_inf2$)
  2333.   ENDIF
  2334.   hdl%=@fcreate(sed_inf$,0)
  2335.   IF hdl%>0
  2336.     x%=32768/dw%
  2337.     y%=32768/dh%
  2338.     '
  2339.     fwritec(hdl%,STR$(fe%(0,1)*x%))     ! Datenfenster
  2340.     fwritec(hdl%,STR$(fe%(0,2)*y%))
  2341.     fwritec(hdl%,STR$(fe%(0,3)*x%))
  2342.     fwritec(hdl%,STR$(fe%(0,4)*y%))
  2343.     '
  2344.     fwritec(hdl%,STR$(max.text%))       ! Zeilen im Textfenster
  2345.     fwritec(hdl%,STR$(dec%))            ! DEC-HEX
  2346.     fwritec(hdl%,STR$(dial.pos%))       ! Dialog -> Maus
  2347.     fwritec(hdl%,STR$(cursor_rate%))
  2348.     fwritec(hdl%,STR$(s.ammeln%))
  2349.     fwritec(hdl%,STR$(tabs%))           ! TAB
  2350.     '
  2351.     fwritec(hdl%,STR$(target%))         ! Targetnummer
  2352.     fwritec(hdl%,STR$(f.eedcode%))      ! Code ⇩
  2353.     fwritec(hdl%,STR$(f.eed%))          ! Seitenvorschub
  2354.     '
  2355.     fwritec(hdl%,STR$(s.lider%))        ! mit Slider?
  2356.     fwritec(hdl%,STR$(t.xtsavm%))       ! mit Datum speichern?
  2357.     fwritec(hdl%,STR$(drive%))          ! Drive speichern
  2358.     '
  2359.     FOR i&=0 TO 7
  2360.       fwritec(hdl%,STR$(hd_typ%(i&)))   ! Plattentypen
  2361.     NEXT i&
  2362.     FOR i&=0 TO 31
  2363.       fwritec(hdl%,STR$(dma%(i&)))      ! DMA-Belegung
  2364.     NEXT i&
  2365.     fwritec(hdl%,fontname$)
  2366.     fwritec(hdl%,STR$(fontsz%))
  2367.     '
  2368.     fwritec(hdl%,STR$(fe%(1,1)*x%))     ! 2. Fenster
  2369.     fwritec(hdl%,STR$(fe%(1,2)*y%))
  2370.     fwritec(hdl%,STR$(fe%(1,3)*x%))
  2371.     fwritec(hdl%,STR$(fe%(1,4)*y%))
  2372.     '
  2373.     FOR i&=1 TO 14                      ! Funktion der 14 kleinen Boxen
  2374.       fwritec(hdl%,STR$(frei%(i&,0)))
  2375.       fwritec(hdl%,STR$(frei%(i&,1)))
  2376.       fwritec(hdl%,STR$(frei%(i&,2)))
  2377.     NEXT i&
  2378.     fwritec(hdl%,inf_ma$)               ! Beschriftung derselben
  2379.     ~@fclose(hdl%)
  2380.   ENDIF
  2381.   mnorm
  2382. RETURN
  2383. PROCEDURE init_help           ! xxx.HLP lesen
  2384.   .| Glob. Var.: p_help$,help_mem%,help_size%,fhandle%
  2385.   .| Ruft auf  : fopen,fseek,alrt,fread2,fclose
  2386.   .| Aufruf in : init_do-1,in_help-1,
  2387.   LOCAL fll%
  2388.   IF EXIST(p_help$)=TRUE
  2389.     IF help_mem%>0
  2390.       ~MFREE(help_mem%)
  2391.       CLR help_size%
  2392.     ENDIF
  2393.     fhandle%=@fopen(p_help$,0)  ! Datei öffnen
  2394.     fll%=@fseek(0,fhandle%,2)
  2395.     ~@fseek(0,fhandle%,0)       ! Offset 0
  2396.     IF fll%<32760
  2397.       help_mem%=MALLOC(fll%)
  2398.       IF help_mem%=0
  2399.         ~@alrt(5,"Kein Speicher für HELP!",1,"kein| Help ")
  2400.       ELSE
  2401.         help_size%=fll%
  2402.         fread2(fhandle%,help_mem%,fll%)
  2403.       ENDIF
  2404.       ~@fclose(fhandle%)
  2405.     ELSE
  2406.       ~@alrt(5,"HELP-Datei zu groß!",1," Aha ")
  2407.     ENDIF
  2408.   ENDIF
  2409. RETURN
  2410. PROCEDURE set_help            ! HELP-Datei --> HELP-Dialog
  2411.   .| Glob. Var.: help_size%,help_mem%,h.elp%,help1&,z.b%,help15&
  2412.   .| Ruft auf  : get_line$,put_char,clr_flags,set_flags
  2413.   .| Aufruf in : rsc_init-1,in_help-1,
  2414.   LOCAL ab%,ax%,i&,j%,a$,buf$
  2415.   '
  2416.   buf$=STRING$(help_size%,0)
  2417.   BMOVE help_mem%,V:buf$,LEN(buf$)
  2418.   '
  2419.   ax%=OB_W(h.elp%,help1&)/z.b%-1
  2420.   i&=help1&
  2421.   ab%=1
  2422.   WHILE ab%<=LEN(buf$)
  2423.     a$=@get_line$(ab%)
  2424.     IF ASC(a$)=45       ! "-"
  2425.       put_char(h.elp%,i&,LEFT$(RIGHT$(a$,LEN(a$)-1),ax%))
  2426.       clr_flags(h.elp%,i&,&H80)
  2427.       INC i&
  2428.     ENDIF
  2429.     EXIT IF i&>help15&
  2430.   WEND
  2431.   DEC i&
  2432.   CLR buf$
  2433.   WHILE i&<=help15&
  2434.     set_flags(h.elp%,i&,&H80)   ! HIDE
  2435.     INC i&
  2436.   WEND
  2437. RETURN
  2438. '
  2439. FUNCTION get_str(VAR ab%)
  2440.   .| Glob. Var.: buf$,cr$
  2441.   .| Aufruf in : init_do-26,
  2442.   LOCAL a&,b&
  2443.   b&=INSTR(ab%,buf$,cr$)
  2444.   a&=ab%
  2445.   ab%=b&+2
  2446.   IF b&>0
  2447.     RETURN VAL(MID$(buf$,a&,b&-a&))
  2448.   ELSE
  2449.     RETURN 0
  2450.   ENDIF
  2451. ENDFUNC
  2452. FUNCTION get_line$(VAR ab%)
  2453.   .| Glob. Var.: buf$,cr$
  2454.   .| Aufruf in : set_help-1,help-1,
  2455.   LOCAL a&,b&
  2456.   b&=INSTR(ab%,buf$,cr$)
  2457.   a&=ab%
  2458.   ab%=b&+2
  2459.   IF b&>0
  2460.     RETURN MID$(buf$,a&,b&-a&)
  2461.   ELSE
  2462.     RETURN ""
  2463.   ENDIF
  2464. ENDFUNC
  2465. ' ----------------------  Harddisk-Routinen --------------------
  2466. PROCEDURE scsicall(op%,block%,cb%,sb%,mp%,cbytes%,flags%)
  2467.   .| Glob. Var.: buf%,scsi_komm%,itar%,target%,bps%,com_blk%,buf2%,geraet%
  2468.   .|     h_error%,scsi%,hbyte%
  2469.   .| Ruft auf  : alrt,set_crcbuf
  2470.   .| Aufruf in : hard_read_sec-1,hard_write-1,hard_command-1,hard_statistik-1
  2471.   .|     hard_prot-2,hard_ship-2,make_part-1,write_root-1,clr_part-3
  2472.   .|     do_root_cbhd-1,hard_format-3,hard_install-6,hard_noboot-1
  2473.   .|     hard_search-2,hard_restore-3,hard_bad-5,hard_set_bad-1,do_mark_bad-4
  2474.   .|     check_bsl-1,do_mode_sense-4,do_mode_select-1,unit_ready-4
  2475.   .|     hard_test_big-2,root_sec-1,hard_do_copy-2,schreiben-1,search_lesen-1,
  2476.   LOCAL block$,a%
  2477.   '
  2478.   a%=MIN(128,cb%)
  2479.   '
  2480.   block$=STRING$(512,0)
  2481.   BMOVE buf%,V:block$,512       ! Puffer retten
  2482.   '
  2483.   CARD{scsi_komm%}=flags%       ! Flagwort
  2484.   CARD{scsi_komm%+2}=itar%      ! Initiator
  2485.   CARD{scsi_komm%+4}=target%    ! Zieltarget
  2486.   CARD{scsi_komm%+6}=a%         ! Anzahl der Blocks
  2487.   IF cb%>128
  2488.     ~@alrt(3,"Platteninterface kann max. 128 Blöcke.|"+STR$(cb%)+" Blöcke wurden angefordert.",1,"Kapiert")
  2489.   ENDIF
  2490.   CARD{scsi_komm%+8}=bps%       ! Blockgröße
  2491.   {scsi_komm%+10}=mp%           ! Pufferadresse
  2492.   CARD{scsi_komm%+14}=cbytes%   ! Anzahl der Kommandobytes 6-10-12?
  2493.   {scsi_komm%+16}=com_blk%      ! Zeiger auf Kommandoblock
  2494.   {scsi_komm%+20}=buf2%         ! Messagepuffer
  2495.   '
  2496.   {com_blk%}=block%             ! Blocknummer
  2497.   BYTE{com_blk%}=op%             ! Kommando
  2498.   BYTE{com_blk%+1}=BYTE{com_blk%+1} OR geraet%*32    ! Gerät  + Blocknummer Hi
  2499.   BYTE{com_blk%+4}=a%            ! Sektoranzahl
  2500.   BYTE{com_blk%+5}=sb%           ! diverse Flags im Kommando
  2501.   '
  2502.   h_error%=C:scsi%(L:scsi_komm%)
  2503.   IF op%<>8                     ! wenn nicht lesen, dann
  2504.     BMOVE buf%,buf2%,512
  2505.     BMOVE V:block$,buf%,512     ! Puffer zurück
  2506.   ENDIF
  2507.   '
  2508.   IF h_error%=0
  2509.     hbyte%=512
  2510.     IF op%=8
  2511.       set_crcbuf
  2512.     ENDIF
  2513.   ELSE
  2514.     CLR hbyte%
  2515.   ENDIF
  2516. RETURN
  2517. PROCEDURE hard_err
  2518.   .| Glob. Var.: h_error%,hard%,hbyte%,scsi_komm%,itar%,target%,buf2%,com_blk%
  2519.   .|     geraet%,scsi%,h_fehler%,fer%,max_err%,hh_max%
  2520.   .| Felder    : scsi_err$(),err_fld$()
  2521.   .| Ruft auf  : getistr$,err_max
  2522.   .| Aufruf in : hard_read_sec-1,hard_write-1,hard_command-1
  2523.   .|     hard_mode_select-1,hard_statistik-1,hard_prot-1,hard_ship-1
  2524.   .|     make_part-1,write_root-1,clr_part-2,do_root_cbhd-1,hard_format-2
  2525.   .|     hard_install-5,hard_noboot-1,hard_search-1,hard_restore-3,hard_bad-3
  2526.   .|     hard_set_bad-1,do_mark_bad-4,check_bsl-1,hard_param-1
  2527.   .|     do_mode_select-1,get_root_info-1,unit_ready-3,hard_test_big-2
  2528.   .|     root_sec-2,hard_do_copy-2,schreiben-1,search_lesen-1,
  2529.   LOCAL a$,b$,sc%
  2530.   '
  2531.   IF h_error%>0
  2532.     IF hard%=2
  2533.       IF hbyte%>255
  2534.         IF (h_error% AND 2)=0
  2535.           CLR h_error%
  2536.         ELSE
  2537.           h_error%=-1
  2538.         ENDIF
  2539.       ELSE
  2540.         h_error%=-1
  2541.       ENDIF
  2542.     ELSE
  2543.       CARD{scsi_komm%}=5          ! Flagwort (wiederholen)
  2544.       CARD{scsi_komm%+2}=itar%    ! Initiator
  2545.       CARD{scsi_komm%+4}=target%  ! Zieltarget
  2546.       CARD{scsi_komm%+6}=0        ! Anzahl der Blocks
  2547.       CARD{scsi_komm%+8}=512      ! Blockgröße
  2548.       {scsi_komm%+10}=buf2%       ! Pufferadresse
  2549.       CARD{scsi_komm%+14}=6       ! Anzahl der Kommandobytes
  2550.       {scsi_komm%+16}=com_blk%    ! Zeiger auf Kommandoblock
  2551.       {scsi_komm%+20}=buf2%       ! Messagepuffer
  2552.       '
  2553.       {com_blk%}=0                ! Blocknummer
  2554.       BYTE{com_blk%}=3            ! Kommando: REQUEST SENSE
  2555.       BYTE{com_blk%+1}=geraet%*32 ! Gerät
  2556.       BYTE{com_blk%+4}=16         ! Byteanzahl??
  2557.       BYTE{com_blk%+5}=0          ! diverse Flags im Kommando
  2558.       sc%=C:scsi%(L:scsi_komm%)   ! Kommando verstanden?
  2559.       IF sc%>0
  2560.         CARD{scsi_komm%}=5              ! nur 4 Byte Antwort
  2561.         CARD{scsi_komm%+2}=itar%
  2562.         CARD{scsi_komm%+4}=target%
  2563.         CARD{scsi_komm%+6}=0
  2564.         CARD{scsi_komm%+8}=512
  2565.         {scsi_komm%+10}=buf2%
  2566.         CARD{scsi_komm%+14}=6
  2567.         {scsi_komm%+16}=com_blk%
  2568.         {scsi_komm%+20}=buf2%
  2569.         {com_blk%}=0
  2570.         BYTE{com_blk%}=3                 ! Kommando: REQUEST SENSE
  2571.         BYTE{com_blk%+1}=geraet%*32
  2572.         BYTE{com_blk%+4}=4               ! 4 Byte lesen
  2573.         BYTE{com_blk%+5}=0
  2574.         sc%=C:scsi%(L:scsi_komm%)
  2575.       ENDIF
  2576.       IF sc%=0
  2577.         ' IF (BYTE{buf2%} AND &H70)=&H70
  2578.         IF hard%=3
  2579.           h_fehler%=BYTE{buf2%+12}
  2580.         ELSE
  2581.           h_fehler%=BYTE{buf2%}
  2582.         ENDIF
  2583.       ELSE
  2584.         h_fehler%=h_error%
  2585.       ENDIF
  2586.     ENDIF
  2587.   ELSE
  2588.     h_fehler%=h_error%
  2589.   ENDIF
  2590.   '
  2591.   IF fer%<max_err%-1 AND h_fehler%<>0
  2592.     INC fer%
  2593.     b$=" -> Target "+STR$(target%)+" Gerät "+STR$(geraet%)
  2594.     IF h_fehler%>=0 AND h_fehler%<hh_max%
  2595.       a$=STR$(h_fehler%)+"  "+@getistr$(h_fehler%,0)
  2596.     ELSE
  2597.       IF h_fehler%>0
  2598.         a$=STR$(h_fehler%)+" Fehler unbekannt"
  2599.       ELSE
  2600.         a$=STR$(h_fehler%)+"  "+scsi_err$(ABS(h_fehler%))
  2601.       ENDIF
  2602.     ENDIF
  2603.     err_fld$(fer%)=a$+b$
  2604.   ELSE
  2605.     err_max
  2606.   ENDIF
  2607. RETURN
  2608. PROCEDURE hard_message(he%)
  2609.   .| Felder    : scsi_err$()
  2610.   .| Ruft auf  : getistr$,alrt
  2611.   .| Aufruf in : hard_zero-1,hard_part-1,make_part-1,clr_part-1,hard_format-1
  2612.   .|     hard_noboot-1,hard_save-1,hard_restore-1,hard_bad-1,hard_param-1
  2613.   .|     hard_root-1,
  2614.   LOCAL a$
  2615.   IF he%>=0
  2616.     a$=LEFT$(@getistr$(he%,0),32)
  2617.   ELSE
  2618.     a$=scsi_err$(ABS(he%))
  2619.   ENDIF
  2620.   ~@alrt(1,"Plattenfehler: |"+STR$(he%)+"  "+a$,1," Aha ")
  2621. RETURN
  2622. '
  2623. PROCEDURE hard_read           ! Block lesen
  2624.   .| Glob. Var.: ex_obj&,block%,eok&,e.ingabe%,ergebnis&,block_marke%
  2625.   .| Ruft auf  : change,do_input,get_char$,term$,hard_read_sec,do_list
  2626.   .| Aufruf in : menu_mess-1,stat_line-1,
  2627.   LOCAL a%,a$,b$
  2628.   change
  2629.   ex_obj&=@do_input("Block lesen",block%)
  2630.   IF ex_obj&=eok&
  2631.     a$=@get_char$(e.ingabe%,ergebnis&)
  2632.     IF a$<>""
  2633.       IF a$="*"
  2634.         block_marke%=block%
  2635.       ELSE
  2636.         IF ASC(a$)=42
  2637.           b$=RIGHT$(a$,LEN(a$)-2)
  2638.           IF MID$(a$,2,1)="-"
  2639.             block%=block_marke%-VAL(b$)
  2640.           ELSE
  2641.             IF MID$(a$,2,1)="+"
  2642.               block%=block_marke%+VAL(b$)
  2643.             ENDIF
  2644.           ENDIF
  2645.         ELSE
  2646.           block%=VAL(a$)
  2647.         ENDIF
  2648.         hard_read_sec(block%)
  2649.         do_list
  2650.       ENDIF
  2651.       '
  2652.     ENDIF
  2653.   ENDIF
  2654. RETURN
  2655. PROCEDURE hard_read_sec(block%)
  2656.   .| Glob. Var.: buf%
  2657.   .| Ruft auf  : scsicall,hard_err
  2658.   .| Aufruf in : hard_read-1,get_root-1,viererblock-1,lesen-1,
  2659.   scsicall(8,block%,1,0,buf%,6,4)
  2660.   hard_err
  2661. RETURN
  2662. PROCEDURE hard_write          ! Block schreiben
  2663.   .| Glob. Var.: a%,block%,el%,buf%
  2664.   .| Ruft auf  : eingabe,scsicall,hard_err
  2665.   .| Aufruf in : menu_mess-1,
  2666.   a%=@eingabe("Block schreiben",block%)
  2667.   IF el%>0 AND a%>=0
  2668.     block%=a%
  2669.     scsicall(10,block%,1,0,buf%,6,2)
  2670.     hard_err
  2671.   ENDIF
  2672. RETURN
  2673. PROCEDURE hard_command        ! Kommando an DMA-Einheit senden
  2674.   .| Glob. Var.: hd.comm%,hdcmok&,hdcmab&,hdflag4&,hdkmblk&,hdkomv1&,hdcm1&
  2675.   .|     hdflag0&,hdflag1&,buf%,buf2%,bps%,j&,i%,code%,hdcm2&,hdcm3&,hdcm4&
  2676.   .|     hdcm5&,hdcm6&,hdcm7&,hdcm8&,hdcm9&,hdcm10&,wa$,com_blk%
  2677.   .| Ruft auf  : box_draw,form_do,clr_state,objc_update,put_char,cross_rsc
  2678.   .|     box_undraw,get_val,alrt,scsicall,hard_err,do_list
  2679.   .| Aufruf in : menu_mess-1,
  2680.   LOCAL h1%,h2%,h3%,h4%,h5%,h6%,h7%,h8%,h9%,anz%,i&
  2681.   LOCAL a%,a$,ex_obj&,com_len%,flg%
  2682.   '
  2683.   box_draw(hd.comm%)
  2684.   DO
  2685.     ex_obj&=@form_do(hd.comm%) AND &HFF
  2686.     clr_state(hd.comm%,ex_obj&,1)
  2687.     objc_update(hd.comm%,ex_obj&)
  2688.     EXIT IF ex_obj&=hdcmok& OR ex_obj&=hdcmab& OR ex_obj&=hdflag4&
  2689.     objc_update(hd.comm%,hdkmblk&)
  2690.     '
  2691.     RESTORE hdkom
  2692.     anz%=(ex_obj&-hdkomv1&)*12
  2693.     WHILE anz%>0
  2694.       READ a%
  2695.       DEC anz%
  2696.     WEND
  2697.     FOR i&=0 TO 9
  2698.       READ a%
  2699.       put_char(hd.comm%,hdcm1&+i&,LEFT$(STR$(a%),4))
  2700.       objc_update(hd.comm%,hdcm1&+i&)
  2701.     NEXT i&
  2702.     READ com_len%
  2703.     READ flg%
  2704.     '
  2705.     FOR i&=0 TO 4
  2706.       cross_rsc(hd.comm%,hdflag0&+i&,(flg% AND 2^i&))
  2707.       objc_update(hd.comm%,hdflag0&+i&)
  2708.     NEXT i&
  2709.     '
  2710.   LOOP
  2711.   box_undraw(hd.comm%)
  2712.   '
  2713.   IF ex_obj&=hdcmok& OR ex_obj&=hdflag4&
  2714.     IF (OB_STATE(hd.comm%,hdflag1&) AND 2)>0    ! Puffer mitsenden
  2715.       BMOVE buf%,buf2%,bps%
  2716.     ELSE
  2717.       a$=STRING$(bps%,0)
  2718.       BMOVE V:a$,buf2%,bps%
  2719.       CLR a$
  2720.     ENDIF
  2721.     '
  2722.     CLR flg%
  2723.     j&=hdflag0&
  2724.     FOR i%=0 TO 4
  2725.       IF (OB_STATE(hd.comm%,j&) AND 2)>0
  2726.         flg%=flg% OR 2^i%
  2727.       ENDIF
  2728.       INC j&
  2729.     NEXT i%
  2730.     '
  2731.     IF ex_obj&<>hdflag4&
  2732.       code%=@get_val(hd.comm%,hdcm1&)
  2733.       h1%=@get_val(hd.comm%,hdcm2&)
  2734.       h2%=@get_val(hd.comm%,hdcm3&)
  2735.       h3%=@get_val(hd.comm%,hdcm4&)
  2736.       h4%=@get_val(hd.comm%,hdcm5&)
  2737.       h5%=@get_val(hd.comm%,hdcm6&)
  2738.       h6%=@get_val(hd.comm%,hdcm7&)
  2739.       h7%=@get_val(hd.comm%,hdcm8&)
  2740.       h8%=@get_val(hd.comm%,hdcm9&)
  2741.       h9%=@get_val(hd.comm%,hdcm10&)
  2742.       h1%=h1%*65536
  2743.       h2%=h2%*256
  2744.     ENDIF
  2745.     a%=1
  2746.     IF code%=4
  2747.       a%=@alrt(2,"Das ist ein FORMAT-Kommando!",0,wa$)
  2748.     ENDIF
  2749.     IF a%=1
  2750.       BYTE{com_blk%+6}=h6%       ! diese Parameter gleich setzen
  2751.       BYTE{com_blk%+7}=h7%
  2752.       BYTE{com_blk%+8}=h8%
  2753.       BYTE{com_blk%+9}=h9%
  2754.       IF (flg% AND 4)>0
  2755.         a$=STRING$(bps%,0)
  2756.         BMOVE V:a$,buf%,bps%
  2757.         CLR a$
  2758.       ENDIF
  2759.       scsicall(code%,h1%+h2%+h3%,h4%,h5%,buf%,com_len%,flg%)
  2760.       IF (flg% AND 4)>0       ! Returnpuffer ansehen?
  2761.         BMOVE buf2%,buf%,bps%
  2762.       ENDIF
  2763.       hard_err
  2764.     ENDIF
  2765.     do_list
  2766.   ENDIF
  2767.   '
  2768. hdkom:
  2769.   DATA 18,0,0,0,48,0,0,0,0,0,6,5
  2770.   DATA 15,0,0,0,0,0,0,0,0,0,6,5
  2771.   DATA 5,0,0,0,0,0,0,0,0,0,6,0
  2772.   DATA 28,0,0,1,4,0,0,0,0,0,6,5
  2773.   DATA 29,4,0,0,0,0,0,0,0,0,6,5
  2774.   DATA 6,3,0,1,20,0,0,0,0,0,6,4
  2775.   DATA 26,0,0,0,50,0,0,0,0,0,6,5
  2776.   DATA 21,0,0,0,0,0,0,0,0,0,6,2
  2777.   DATA 30,0,0,0,0,0,0,0,0,0,6,0
  2778. RETURN
  2779. '
  2780. PROCEDURE hard_mode_sense     ! MODE SENSE
  2781.   .| Glob. Var.: hard%
  2782.   .| Ruft auf  : do_mode_sense,show_hard_data,look_ex
  2783.   .| Aufruf in : menu_mess-1,
  2784.   do_mode_sense
  2785.   show_hard_data
  2786.   IF hard%<>2
  2787.     look_ex
  2788.   ENDIF
  2789. RETURN
  2790. PROCEDURE show_hard_data      ! HARD Parameter zeigen
  2791.   .| Glob. Var.: hard%
  2792.   .| Ruft auf  : hard_param,nix_vortex
  2793.   .| Aufruf in : hard_mode_sense-1,
  2794.   IF hard%<>2
  2795.     hard_param
  2796.   ELSE
  2797.     nix_vortex
  2798.   ENDIF
  2799. RETURN
  2800. '
  2801. PROCEDURE hard_mode_select    ! MODE SELECT
  2802.   .| Glob. Var.: hard%
  2803.   .| Ruft auf  : hard_param,do_mode_select,hard_err,alrt,nix_vortex
  2804.   .| Aufruf in : menu_mess-1,
  2805.   IF hard%<>2
  2806.     IF hard%<2
  2807.       hard_param
  2808.       do_mode_select
  2809.       hard_err
  2810.     ELSE
  2811.       ~@alrt(3,"Das geht im Moment nicht|bei SCSI- und VORTEX-Platten.",1,"Abbruch")
  2812.     ENDIF
  2813.   ELSE
  2814.     nix_vortex
  2815.   ENDIF
  2816. RETURN
  2817. PROCEDURE hard_statistik      ! READ USAGE COUNTER
  2818.   .| Glob. Var.: erg%,buf%,target%,geraet%,buf2%,h_error%
  2819.   .| Ruft auf  : scsicall,clr_out,out,hard_err,out_do,show_err_inf
  2820.   .| Aufruf in : menu_mess-1,
  2821.   LOCAL a$
  2822.   erg%=3
  2823.   scsicall(17,0,0,0,buf%,6,1+4)
  2824.   clr_out("Statistik (Target "+STR$(target%)+", Gerät "+STR$(geraet%)+")")
  2825.   out("")
  2826.   a$=STR$(CARD{buf2%}*256+BYTE{buf2%+2})
  2827.   out("Sektorlesezähler          : "+a$)
  2828.   a$=STR$(BYTE{buf2%+3}*&H10000+CARD{buf2%+4})
  2829.   out("Suchzähler                : "+a$)
  2830.   out("Nichtkorrigierbare Fehler : "+STR$(BYTE{buf2%+6}))
  2831.   out("     korrigierbare Fehler : "+STR$(BYTE{buf2%+7}))
  2832.   out("Fehler beim Suchen        : "+STR$(BYTE{buf2%+8}))
  2833.   hard_err
  2834.   IF h_error%=0
  2835.     out_do
  2836.   ELSE
  2837.     show_err_inf
  2838.   ENDIF
  2839. RETURN
  2840. PROCEDURE hard_prot           ! Write protekt Trick
  2841.   .| Glob. Var.: hard%,buf%
  2842.   .| Ruft auf  : scsicall,hard_err,alrt
  2843.   .| Aufruf in : menu_mess-1,
  2844.   IF hard%=1
  2845.     scsicall(26,0,24,0,buf%,6,1+4)  ! Mode Sense
  2846.     scsicall(21,0,24,0,buf%,6,2)    ! Mode Select
  2847.     hard_err
  2848.   ELSE
  2849.     ~@alrt(1,"Diese Option ist nur bei|Adaptec-Controllern (ATARI-Modus) |anwendbar.",1," Aha ")
  2850.   ENDIF
  2851. RETURN
  2852. PROCEDURE hard_ship           ! Platten parken
  2853.   .| Glob. Var.: hard%,buf%
  2854.   .| Ruft auf  : alrt,scsicall,hard_err,info_line
  2855.   .| Aufruf in : menu_mess-1,
  2856.   LOCAL wwa%
  2857.   wwa%=@alrt(2,"Platte parken?",0,"Parken|Entpark|Abbruch")
  2858.   IF wwa%<3
  2859.     IF hard%=2
  2860.       scsicall(31,0,0,0,buf%,6,0)       ! VORTEX Park-Befehl
  2861.     ELSE
  2862.       scsicall(27,0,wwa%-1,0,buf%,6,0)  ! Rest der Welt
  2863.     ENDIF
  2864.     hard_err
  2865.     info_line
  2866.   ENDIF
  2867. RETURN
  2868. PROCEDURE hard_zero           ! Partition löschen
  2869.   .| Glob. Var.: platte$,wa$,h_error%,part%,block%,h_fehler%
  2870.   .| Felder    : p_start%()
  2871.   .| Ruft auf  : no_protekt,alrt,root_sec,part_select,clr_part,hard_set_bad
  2872.   .|     hard_message,do_list
  2873.   .| Aufruf in : menu_mess-1,
  2874.   IF @no_protekt=1
  2875.     IF @alrt(4,"Platte: "+platte$+"|ACHTUNG: Partition löschen?|Daten gehen rettungslos verloren!!",0,wa$)=1
  2876.       root_sec(1)
  2877.       IF h_error%=0
  2878.         part%=@part_select
  2879.         IF part%>=0
  2880.           IF @no_protekt=1
  2881.             block%=p_start%(part%)
  2882.             clr_part(part%,block%)
  2883.             hard_set_bad
  2884.           ENDIF
  2885.         ENDIF
  2886.       ELSE
  2887.         hard_message(h_fehler%)
  2888.         do_list
  2889.       ENDIF
  2890.     ENDIF
  2891.   ENDIF
  2892. RETURN
  2893. ' ----------------------
  2894. PROCEDURE hard_part           ! Platte partitionieren
  2895.   .| Glob. Var.: h_error%,hi_size%,root$,bps%,buf%,bsl_start%,bsl_count%,p1k&
  2896.   .|     p12k&,p.art%,cbhd_found%,pcbhd&,partok&,h_fehler%
  2897.   .| Felder    : p_start%(),p_id$()
  2898.   .| Ruft auf  : no_protekt,get_root_info,hard_test_big,set_root,put_char
  2899.   .|     set_state,clr_state,hard_part_sel,check_part_beginn,do_part
  2900.   .|     hard_set_bad,hard_root,hard_message,mnorm
  2901.   .| Aufruf in : menu_mess-1,
  2902.   LOCAL a%,i&,j%,ex_obj&
  2903.   '
  2904.   IF @no_protekt=1
  2905.     get_root_info
  2906.     IF h_error%=0
  2907.       a%=@hard_test_big
  2908.       IF a%>0
  2909.         hi_size%=a%
  2910.       ENDIF
  2911.       set_root
  2912.       root$=STRING$(bps%,0)
  2913.       BMOVE buf%,V:root$,bps%   ! Rootsektor retten
  2914.       '
  2915.       p_start%(1)=MAX(2,p_start%(1))
  2916.       bsl_start%=1
  2917.       ' bsl_count%=MIN(5,bsl_count%)
  2918.       bsl_count%=MIN(31,bsl_count%)  !RS: zerstört nicht mein MS-DOS-Medium
  2919.       p_start%(1)=bsl_start%+bsl_count%
  2920.       '
  2921.       j%=1
  2922.       FOR i&=p1k& TO p12k& STEP 5
  2923.         IF p_id$(j%)="" OR p_id$(j%)="   "
  2924.           p_id$(j%)="GEM"
  2925.         ENDIF
  2926.         put_char(p.art%,i&,p_id$(j%))
  2927.         INC j%
  2928.       NEXT i&
  2929.       '
  2930.       IF cbhd_found%
  2931.         set_state(p.art%,pcbhd&,1)
  2932.         clr_state(p.art%,pcbhd&+1,1)
  2933.       ENDIF
  2934.       '
  2935.       ex_obj&=@hard_part_sel    ! PART-Dialog = Abbruch
  2936.       IF ex_obj&=partok&
  2937.         check_part_beginn
  2938.         do_part
  2939.         hard_set_bad
  2940.         hard_root
  2941.       ENDIF
  2942.     ELSE
  2943.       hard_message(h_fehler%)
  2944.     ENDIF
  2945.   ENDIF
  2946.   mnorm
  2947. RETURN
  2948. PROCEDURE set_part_par        ! Partitionsinfo setzen
  2949.   .| Glob. Var.: part_oben%,p1s&,p12s&,bps%,a%,p.art%,prest&
  2950.   .| Felder    : p_size%()
  2951.   .| Ruft auf  : put_char,objc_update,add_size
  2952.   .| Aufruf in : part_slide-1,part_slide_page-1,hard_part_sel-2,part_gleiche-1,
  2953.   LOCAL a$,a#,b%,i&,j%
  2954.   '                        12 sichtbare Partitionen setzen
  2955.   j%=part_oben%
  2956.   FOR i&=p1s& TO p12s& STEP 5
  2957.     b%=1024/MAX(512,bps%)*1024
  2958.     a%=INT(p_size%(j%)/b%*100+0.05)
  2959.     a$=RIGHT$("     "+STR$(a%),5)
  2960.     put_char(p.art%,i&,a$)
  2961.     objc_update(p.art%,i&)
  2962.     INC j%
  2963.   NEXT i&
  2964.   add_size
  2965.   objc_update(p.art%,prest&)
  2966. RETURN
  2967. PROCEDURE part_slide          ! Slider im Part-Dialog
  2968.   .| Glob. Var.: p.art%,partsli1&,partsli2&,part_oben%,max_part%
  2969.   .| Ruft auf  : get_id,get_value,objc_update,set_part_dial,set_part_par
  2970.   .| Aufruf in : hard_part_sel-1,
  2971.   LOCAL a%,c%,h%,yk%,hk%
  2972.   '
  2973.   a%=GRAF_SLIDEBOX(p.art%,partsli1&,partsli2&,1) ! Slider bewegen
  2974.   get_id(part_oben%)            ! IDs auslesen
  2975.   get_value(part_oben%)
  2976.   '
  2977.   hk%=OB_H(p.art%,partsli2&)    ! Höhe des Sliders holen
  2978.   h%=OB_H(p.art%,partsli1&)     ! Höhe des Slider-Vaters holen
  2979.   yk%=OB_H(p.art%,partsli1&)    ! y-Koordinate Vater-Objects holen
  2980.   IF a%>0
  2981.     c%=(h%-hk%)/1000*a%
  2982.   ELSE
  2983.     CLR c%
  2984.   ENDIF
  2985.   '
  2986.   OB_Y(p.art%,partsli2&)=c%     ! neue Relative y-Koordinate des Sliders setzen
  2987.   objc_update(p.art%,partsli1&) ! Neu zeuchnen
  2988.   '                             ! Pointer "oben" neu setzen
  2989.   part_oben%=MAX(1,((max_part%-13)/1000)*a%+1)
  2990.   set_part_dial(part_oben%)
  2991.   set_part_par                  ! Und die restlichen Parameter
  2992. RETURN
  2993. PROCEDURE add_size            ! alle Partitionen zusammen zählen
  2994.   .| Glob. Var.: bps%,p.art%,prest&
  2995.   .| Ruft auf  : get_rest,put_char
  2996.   .| Aufruf in : set_part_par-1,hard_part_sel-1,
  2997.   LOCAL a$,b%,a#
  2998.   b%=1024/MAX(512,bps%)*1024
  2999.   a#=INT(@get_rest/b%*100)
  3000.   a$=RIGHT$("       "+STR$(a#),7)
  3001.   put_char(p.art%,prest&,a$)
  3002. RETURN
  3003. FUNCTION get_rest             ! Rest feststellen (Partitionieren)
  3004.   .| Glob. Var.: s_total%,max_part%,hi_size%
  3005.   .| Felder    : p_start%(),p_size%()
  3006.   .| Aufruf in : add_size-1,
  3007.   LOCAL i%
  3008.   s_total%=p_start%(1)
  3009.   FOR i%=1 TO max_part%
  3010.     ADD s_total%,p_size%(i%)
  3011.   NEXT i%
  3012.   RETURN hi_size%-s_total%
  3013. ENDFUNC
  3014. '
  3015. PROCEDURE part_slide_page     ! Slider im Part-Dialog
  3016.   .| Glob. Var.: my%,part_oben%,yvv%,p.art%,partsli2&,partsli1&,max_part%,ab%
  3017.   .|     np%
  3018.   .| Ruft auf  : get_id,get_value,objc_update,set_part_dial,set_part_par
  3019.   .| Aufruf in : hard_part_sel-1,
  3020.   LOCAL h%,hk%,y%,yk%
  3021.   '
  3022.   my%=MOUSEY
  3023.   get_id(part_oben%)            ! IDs auslesen
  3024.   get_value(part_oben%)
  3025.   '
  3026.   yvv%=OB_Y(p.art%,1)+OB_Y(p.art%,0)  ! y-Offset Vater
  3027.   hk%=OB_H(p.art%,partsli2&)    ! Höhe des Sohn holen
  3028.   h%=OB_H(p.art%,partsli1&)     ! Höhe des Slider-Vaters holen
  3029.   y%=OB_Y(p.art%,partsli2&)     ! y-Koordinate Sohn-Object
  3030.   '
  3031.   IF yvv%+y%+hk%<my%
  3032.     part_oben%=MIN(max_part%-12,part_oben%+12)
  3033.     IF ab%>0
  3034.       part_oben%=max_part%-12
  3035.     ENDIF
  3036.   ELSE
  3037.     part_oben%=MAX(1,part_oben%-12)
  3038.     IF ab%>0
  3039.       part_oben%=1
  3040.     ENDIF
  3041.   ENDIF
  3042.   np%=h%/60*part_oben%-2
  3043.   OB_Y(p.art%,partsli2&)=np%    ! neue Relative y-Koordinate des Sliders setzen
  3044.   objc_update(p.art%,partsli1&) ! Vater
  3045.   '
  3046.   set_part_dial(part_oben%)
  3047.   set_part_par                  ! Und die restlichen Parameter
  3048. RETURN
  3049. PROCEDURE set_part_dial(part_oben%)
  3050.   .| Glob. Var.: p1n&,p12n&,p.art%,p1k&,p12k&,a$
  3051.   .| Felder    : p_id$()
  3052.   .| Ruft auf  : put_wert,objc_update,put_char
  3053.   .| Aufruf in : part_slide-1,part_slide_page-1,part_gleiche-1,
  3054.   LOCAL j&,i&
  3055.   '                             ! Pointer "oben" neu setzen
  3056.   j&=part_oben%                 ! und Nummern vorne neu stzen
  3057.   FOR i&=p1n& TO p12n& STEP 5
  3058.     put_wert(p.art%,i&,j&,2)
  3059.     objc_update(p.art%,i&)
  3060.     INC j&
  3061.   NEXT i&
  3062.   j&=part_oben%                 ! danach IDs neu setzen
  3063.   FOR i&=p1k& TO p12k& STEP 5
  3064.     a$=p_id$(j&)
  3065.     IF a$="" OR a$="   "
  3066.       a$="GEM"
  3067.     ENDIF
  3068.     put_char(p.art%,i&,a$)
  3069.     objc_update(p.art%,i&)
  3070.     INC j&
  3071.   NEXT i&
  3072. RETURN
  3073. '
  3074. FUNCTION hard_part_sel        ! Part-Dialog
  3075.   .| Glob. Var.: part_oben%,p.art%,partitel&,platte$,partsli1&,partsli2&
  3076.   .|     pvariabl&,prest&,partok&,partab&,max_part%,hi_size%
  3077.   .| Felder    : p_size%(),p_id$()
  3078.   .| Ruft auf  : put_char,box_draw,set_part_par,form_do,part_slide_page
  3079.   .|     part_slide,clr_state,part_gleiche,get_value,add_size,objc_update,alrt
  3080.   .|     get_id,box_undraw
  3081.   .| Aufruf in : hard_part-1,
  3082.   LOCAL a%,ab%,akt%,ex_obj&,s%,i&
  3083.   '
  3084.   part_oben%=1
  3085.   put_char(p.art%,partitel&,LEFT$(platte$,20))
  3086.   box_draw(p.art%)
  3087.   REPEAT
  3088.     set_part_par
  3089.     DO
  3090.       ex_obj&=@form_do(p.art%)
  3091.       ab%=ex_obj& AND &HFF00
  3092.       ex_obj&=ex_obj& AND &HFF
  3093.       '
  3094.       SELECT ex_obj&
  3095.       CASE partsli1&
  3096.         part_slide_page         ! Slider
  3097.       CASE partsli2&
  3098.         part_slide              ! Sliderbewegung
  3099.       CASE pvariabl&
  3100.         clr_state(p.art%,ex_obj&,1)
  3101.         part_gleiche
  3102.       CASE prest&
  3103.         get_value(part_oben%)
  3104.         add_size
  3105.       ENDSELECT
  3106.       '
  3107.       EXIT IF ex_obj&=partok& OR ex_obj&=partab&
  3108.       set_part_par
  3109.     LOOP
  3110.     clr_state(p.art%,ex_obj&,1)
  3111.     objc_update(p.art%,ex_obj&)
  3112.     '
  3113.     get_value(part_oben%)
  3114.     ' CLR s%
  3115.     FOR i&=1 TO max_part%
  3116.       ADD s%,p_size%(i&)
  3117.       ' IF p_size%(i&)<32768 AND p_id$(i&)="BGM"
  3118.       IF p_size%(i&)<=dos_max_sectors% AND p_id$(i&)="BGM"
  3119.         p_id$(i&)="GEM"
  3120.       ENDIF
  3121.       ' IF p_size%(i&)>32767 AND p_id$(i&)="GEM"
  3122.       IF p_size%(i&)>dos_max_sectors% AND p_id$(i&)="GEM"
  3123.         p_id$(i&)="BGM"
  3124.       ENDIF
  3125.     NEXT i&
  3126.     '
  3127.     IF s%>hi_size% AND ex_obj&=partok&
  3128.       ~@alrt(3,"Sie sollten sich die 'Rest-Anzeige' ansehen!",1,"Nochmal")
  3129.       CLR ex_obj&
  3130.     ENDIF
  3131.     '
  3132.   UNTIL ex_obj&=partab& OR ex_obj&=partok&
  3133.   '
  3134.   get_id(part_oben%)            ! IDs auslesen
  3135.   get_value(part_oben%)         ! Größen auslesen
  3136.   box_undraw(p.art%)
  3137.   clr_state(p.art%,ex_obj&,1)
  3138.   '
  3139.   RETURN ex_obj&
  3140. ENDFUNC
  3141. FUNCTION part_select          ! Partition auswählen
  3142.   .| Glob. Var.: p.sel%,psnummer&,pselabb&,pselok&,psmin&,psmax&,part_total%
  3143.   .| Ruft auf  : put_char,box_draw,form_do,clr_state,objc_update,box_undraw
  3144.   .| Aufruf in : hard_zero-1,hard_install-1,
  3145.   LOCAL ab%,i%,ex_obj&
  3146.   ab%=1
  3147.   put_char(p.sel%,psnummer&,"1")
  3148.   box_draw(p.sel%)
  3149.   DO
  3150.     ex_obj&=@form_do(p.sel%) AND &HFF
  3151.     EXIT IF ex_obj&=pselabb& OR ex_obj&=pselok&
  3152.     SELECT ex_obj&
  3153.     CASE psmin&
  3154.       ab%=MAX(ab%-1,1)
  3155.     CASE psmax&
  3156.       ab%=MIN(part_total%,ab%+1)
  3157.     ENDSELECT
  3158.     clr_state(p.sel%,ex_obj&,1)
  3159.     put_char(p.sel%,psnummer&,STR$(ab%))
  3160.     objc_update(p.sel%,psnummer&)
  3161.     objc_update(p.sel%,ex_obj&)
  3162.   LOOP
  3163.   box_undraw(p.sel%)
  3164.   clr_state(p.sel%,ex_obj&,1)
  3165.   IF ex_obj&<>pselabb&
  3166.     RETURN ab%          ! 1-xxx
  3167.   ELSE
  3168.     RETURN -1
  3169.   ENDIF
  3170. ENDFUNC
  3171. '
  3172. PROCEDURE part_gleiche        ! n gleiche Partitionen
  3173.   .| Glob. Var.: p.art%,el%,hi_size%,max_part%,part_oben%
  3174.   .| Felder    : p_size%(),p_id$()
  3175.   .| Ruft auf  : box_undraw,eingabe,box_draw,set_part_dial,set_part_par
  3176.   .| Aufruf in : hard_part_sel-1,
  3177.   LOCAL anz%,psize%,i%
  3178.   box_undraw(p.art%)
  3179.   anz%=@eingabe("Anzahl der Partitionen:",0)
  3180.   IF el%>0
  3181.     IF anz%>0 AND anz%<15
  3182.       psize%=INT((hi_size%-anz%)/anz%)
  3183.       FOR i%=1 TO anz%
  3184.         p_size%(i%)=psize%
  3185.         IF p_size%(i%)<32768
  3186.           p_id$(i%)="GEM"
  3187.         ELSE
  3188.           p_id$(i%)="BGM"
  3189.         ENDIF
  3190.       NEXT i%
  3191.       FOR i%=anz%+1 TO max_part%
  3192.         p_size%(i%)=0
  3193.       NEXT i%
  3194.     ENDIF
  3195.   ENDIF
  3196.   box_draw(p.art%)
  3197.   set_part_dial(part_oben%)
  3198.   set_part_par
  3199. RETURN
  3200. PROCEDURE get_id(j%)          ! Partitions IDs auslesen
  3201.   .| Glob. Var.: p1k&,p12k&,p.art%
  3202.   .| Felder    : p_id$()
  3203.   .| Ruft auf  : get_char$
  3204.   .| Aufruf in : part_slide-1,part_slide_page-1,hard_part_sel-1,
  3205.   LOCAL i&
  3206.   FOR i&=p1k& TO p12k& STEP 5
  3207.     p_id$(j%)=@get_char$(p.art%,i&)
  3208.     INC j%
  3209.   NEXT i&
  3210. RETURN
  3211. PROCEDURE get_value(j%)       ! Partitionsgrößen auslesen
  3212.   .| Glob. Var.: p1s&,p12s&,p.art%
  3213.   .| Felder    : p_size%()
  3214.   .| Ruft auf  : get_char$
  3215.   .| Aufruf in : part_slide-1,part_slide_page-1,hard_part_sel-3,
  3216.   LOCAL i%,a#,a$
  3217.   '
  3218.   FOR i%=p1s& TO p12s& STEP 5
  3219.     a$=LEFT$(@get_char$(p.art%,i%)+"     ",5)
  3220.     a#=VAL(LEFT$(a$,3)+"."+RIGHT$(a$,2))
  3221.     p_size%(j%)=(a#*1024*1024)/512
  3222.     INC j%
  3223.   NEXT i%
  3224. RETURN
  3225. ' ----------------------
  3226. PROCEDURE make_part(m%)       ! 1 Partition anlegen
  3227.   .| Glob. Var.: hi_spc%,boot.raw%,buf%,hi_spt%,hi_dhc%,block%,h_error%
  3228.   .|     h_fehler%
  3229.   .| Felder    : p_size%(),p_start%()
  3230.   .| Ruft auf  : scsicall,hard_err,clr_part,hard_message
  3231.   .| Aufruf in : do_part-1,xgm_part-5,do_part_cbhd-1,
  3232.   LOCAL a$,bps_2%,i%,j%,len_dir%,len_fat%
  3233.   '
  3234.   hi_spc%=2
  3235.   a$=STRING$(512,0)                     ! Bootsektor löschen
  3236.   BMOVE V:a$,buf%,512
  3237.   bps_2%=512
  3238.   j%=p_size%(m%)
  3239.   IF j%=dos_max_sectors%+1 THEN         !RS: um die Cluster klein zu halten
  3240.     DEC j%
  3241.   ENDIF
  3242.   WHILE j%>dos_max_sectors%             ! Logische Sektorgröße berechnen
  3243.     DIV j%,2
  3244.     ADD bps_2%,bps_2%
  3245.     IF j%=dos_max_sektors%+1 THEN       !RS: um die Cluster klein zu halten
  3246.       DEC j%
  3247.     ENDIF
  3248.   WEND
  3249.   '
  3250.   CARD{buf%}=&HEB3C                     ! INTEL short jump
  3251.   BYTE{buf%+2}=&H90                     !
  3252.   CHAR{buf%+3}="SED56"                  ! Name
  3253.   i%=XBIOS(17)                          ! Random()
  3254.   CARD{buf%+&H8}=ROL&(i%,8)             ! Seriennummer
  3255.   BYTE{buf%+&HA}=SHR(i%,16)
  3256.   BYTE{buf%+11}=bps_2% MOD 256          ! BPS = log. Sektorgröße
  3257.   BYTE{buf%+12}=bps_2% DIV 256
  3258.   BYTE{buf%+13}=hi_spc%                 ! Sektoren/Cluster
  3259.   BYTE{buf%+14}=1                       ! Anzahl reservierter Sektoren
  3260.   BYTE{buf%+15}=0
  3261.   BYTE{buf%+16}=2                       ! Anzahl der FATs
  3262.   len_dir%=MAX(256,bps_2%/32)           ! 256 Einträge von 512-8192 Byte/Sektor
  3263.   BYTE{buf%+17}=len_dir% MOD 256        ! Einträge im Wurzelverzeichnis
  3264.   BYTE{buf%+18}=len_dir% DIV 256
  3265.   BYTE{buf%+19}=j% MOD 256              ! Anzahl der Sektoren
  3266.   BYTE{buf%+20}=j% DIV 256
  3267.   BYTE{buf%+21}=&HF8                    ! MEDIA
  3268.   '                                       Sektoren je FAT
  3269.   len_fat%=(((((j%-1-len_dir%) DIV hi_spc%)+2)*2)+bps_2%-1) DIV bps_2%
  3270.   IF len_fat%>((((((j%-1-2*(len_fat%-1)-len_dir%) DIV hi_spc%)+2)*2)+bps_2%-1) DIV bps_2%)
  3271.     DEC len_fat%
  3272.   ENDIF
  3273.   BYTE{buf%+22}=len_fat% MOD 256        ! Sektoren je FAT
  3274.   BYTE{buf%+23}=len_fat% DIV 256
  3275.   BYTE{buf%+24}=hi_spt%                 ! Sektoren pro Track
  3276.   BYTE{buf%+25}=0
  3277.   BYTE{buf%+26}=hi_dhc%                 ! Anzahl der Köpfe
  3278.   BYTE{buf%+27}=0
  3279.   CARD{buf%+28}=0                       ! versteckte Sektoren
  3280.   ' Erweiterter Bootsektor wie MS-DOS 4.00
  3281.   ' In spt% und heads% muß die vom PC-Controller simulierte Anzahl stehen!
  3282.   CARD{buf%+&H18}=ROL&(32,8)            ! Sektoren pro Spur (INTEL-Format)
  3283.   CARD{buf%+&H1A}=ROL&(64,8)            ! Köpfe (INTEL-Format)
  3284.   LONG{buf%+&H1C}=SHL(ROL&(p_start%(m%),8),16)+ROL&(SHR(p_start%(m%),16),8) !versteckte Sektoren (INTEL-Format)
  3285.   IF j%>=65536 THEN
  3286.     BYTE{buf%+&H13}=0                   ! Anzahl der Sektoren
  3287.     BYTE{buf%+&H14}=0
  3288.     LONG{buf%+&H20}=SHL(ROL&(j%,8),16)+ROL&(SHR(j%,16),8) !Sektoren (INTEL-Format)
  3289.   ELSE
  3290.     LONG{buf%+&H20}=0
  3291.   ENDIF
  3292.   BYTE{buf%+&H24}=0                     ! physikalische Laufwerksnummer für MS-DOS
  3293.   BYTE{buf%+&H25}=0                     ! für MS-DOS reserviert
  3294.   BYTE{buf%+&H26}=&H29                  ! Kennung für erweiterten BPB
  3295.   i%=GEMDOS(44)                         ! Tgettime()
  3296.   BYTE{buf%+&H27}=i%                    ! Seriennummer
  3297.   BYTE{buf%+&H28}=SHR(i%,8)
  3298.   i%=GEMDOS(42)                         ! Tgetdate()
  3299.   BYTE{buf%+&H29}=i%                    ! noch Seriennummer
  3300.   BYTE{buf%+&H2A}=SHR(i%,8)
  3301.   CHAR{buf%+&H2B}="           FAT16   " ! Medienname und FAT-Typ
  3302.   CARD{buf%+&H1FE}=&H1235-@chk_sum      ! ungültige Prüfsumme für Atari
  3303.   ' -------------------------------------
  3304.   block%=p_start%(m%)                   ! Blocknummer holen
  3305.   WHILE bps_2%>0
  3306.     scsicall(10,block%,1,0,buf%,6,2)    ! schreibe Bootsektor
  3307.     hard_err
  3308.     EXIT IF h_error%<>0
  3309.     INC block%                          ! und evtl. Sektoren bis log.SEKTOR 1
  3310.     a$=STRING$(512,0)                   ! löschen
  3311.     BMOVE V:a$,buf%,512
  3312.     SUB bps_2%,512
  3313.   WEND
  3314.   IF h_error%=0
  3315.     clr_part(m%,p_start%(m%))           ! ab Block%+1 schreiben
  3316.     ' RS: Der Cluster, in dem der Sektor an der Vorzeichengrenze der
  3317.     ' GEMDOS-Sektorpuffer liegt, wird in der FAT als defekt markiert.
  3318.     ' Gehört in hard_set_bad, damit es auch bei »Partition löschen«
  3319.     ' aufgerufen wird. Ich weiß jetzt nur nicht, wie ich an die nötigen
  3320.     ' Variablen rankomme.
  3321.     i%=1+2*len_fat%+len_dir%+(-2*hi_spc%+&H7FFF)
  3322.     IF j%>=i% THEN
  3323.       do_mark_bad(p_start%(m%)+i%*bps_2%/512)
  3324.     ENDIF
  3325.   ELSE
  3326.     hard_message(h_fehler%)
  3327.   ENDIF
  3328.   CLR a$
  3329. RETURN
  3330. PROCEDURE do_part             ! Partitionen anlegen
  3331.   .| Glob. Var.: p.art%,pcbhd&,part%
  3332.   .| Felder    : p_size%()
  3333.   .| Ruft auf  : do_part_cbhd,do_root_cbhd,alrt,xgm_part,clear_root,set__pid
  3334.   .|     write_root,make_part
  3335.   .| Aufruf in : hard_part-1,
  3336.   LOCAL i%
  3337.   '
  3338.   IF (OB_STATE(p.art%,pcbhd&) AND 1)<>0
  3339.     IF part%<13
  3340.       do_part_cbhd
  3341.       do_root_cbhd
  3342.     ELSE
  3343.       ~@alrt(4,"Nur bis max. 12 Partitionen!",1,"Abbruch")
  3344.     ENDIF
  3345.   ELSE
  3346.     IF part%>4
  3347.       xgm_part(1,part%,0)         ! XGM ...
  3348.     ELSE
  3349.       clear_root                  ! Rootsektor erstellen im Puffer
  3350.       FOR i%=1 TO 4               ! normal
  3351.         IF p_size%(i%)>0
  3352.           set__pid(i%-1,i%,0)
  3353.         ENDIF
  3354.       NEXT i%
  3355.       write_root(0)
  3356.       FOR i%=1 TO 4
  3357.         IF p_size%(i%)>0
  3358.           make_part(i%)
  3359.         ENDIF
  3360.       NEXT i%
  3361.     ENDIF
  3362.   ENDIF
  3363. RETURN
  3364. PROCEDURE xgm_part(pfirst%,plast%,xgmoffset%)
  3365.   .| Felder    : p_start%(),p_size%()
  3366.   .| Ruft auf  : clear_root,set__pid,write_root,make_part,set_xpid,xgm_part
  3367.   .| Aufruf in : do_part-1,xgm_part-2,
  3368.   LOCAL currblock%,x1%
  3369.   '
  3370.   clear_root                    ! Rootsektor erstellen im Puffer
  3371.   IF pfirst%=plast%             ! letzten XGM-ROOT-Sektor schreiben
  3372.     currblock%=p_start%(pfirst%)
  3373.     INC p_start%(pfirst%)
  3374.     DEC p_size%(pfirst%)
  3375.     set__pid(0,pfirst%,currblock%)
  3376.     write_root(currblock%)
  3377.     make_part(pfirst%)
  3378.   ELSE
  3379.     IF pfirst%=1                ! ersten ROOT-Sektor schreiben
  3380.       set__pid(0,pfirst%,0)
  3381.       set_xpid(1,pfirst%+1,0)
  3382.       set__pid(2,plast%-1,0)
  3383.       set__pid(3,plast%,0)
  3384.       write_root(0)
  3385.       make_part(pfirst%)
  3386.       make_part(plast%-1)
  3387.       make_part(plast%)
  3388.       xgm_part(pfirst%+1,plast%-2,p_start%(pfirst%+1))
  3389.     ELSE
  3390.       currblock%=p_start%(pfirst%)      ! XGM-ROOT-Sektor schreiben
  3391.       INC p_start%(pfirst%)
  3392.       DEC p_size%(pfirst%)
  3393.       set__pid(0,pfirst%,currblock%)    ! GEM-Eintrag
  3394.       set_xpid(1,pfirst%+1,xgmoffset%)  ! XGM-Eintrag
  3395.       write_root(currblock%)            ! und schreiben
  3396.       make_part(pfirst%)                ! BOOT+FAT-Sektoren
  3397.       xgm_part(pfirst%+1,plast%,xgmoffset%)
  3398.     ENDIF
  3399.   ENDIF
  3400. RETURN
  3401. PROCEDURE set__pid(num%,a%,cblock%)
  3402.   .| Glob. Var.: buf%
  3403.   .| Felder    : p_id$(),p_start%(),p_size%()
  3404.   .| Aufruf in : do_part-1,xgm_part-5,
  3405.   LOCAL x1%
  3406.   x1%=buf%+&H1C6+num%*12
  3407.   BYTE{x1%}=1
  3408.   BMOVE V:p_id$(a%),x1%+1,3             ! Kennung
  3409.   {x1%+4}=p_start%(a%)-cblock%          ! Start
  3410.   {x1%+8}=p_size%(a%)                   ! Size
  3411. RETURN
  3412. PROCEDURE set_xpid(num%,a%,xgmo%)
  3413.   .| Glob. Var.: buf%
  3414.   .| Felder    : p_start%(),p_size%()
  3415.   .| Aufruf in : xgm_part-2,
  3416.   LOCAL x1%
  3417.   x1%=buf%+&H1C6+num%*12
  3418.   BYTE{x1%}=1
  3419.   BYTE{x1%+1}=ASC("X")
  3420.   BYTE{x1%+2}=ASC("G")
  3421.   BYTE{x1%+3}=ASC("M")
  3422.   {x1%+4}=p_start%(a%)-xgmo%
  3423.   {x1%+8}=p_size%(a%)
  3424. RETURN
  3425. PROCEDURE clear_root          ! ROOT-Sektor im Speicher erstellen
  3426.   .| Glob. Var.: buf%
  3427.   .| Ruft auf  : set_rootdaten
  3428.   .| Aufruf in : do_part-1,xgm_part-1,do_root_cbhd-1,
  3429.   LOCAL a$
  3430.   a$=STRING$(512,0)
  3431.   BMOVE V:a$,buf%,LEN(a$)
  3432.   set_rootdaten
  3433.   CLR a$
  3434. RETURN
  3435. PROCEDURE write_root(block%)  ! ROOT Sektor schreiben
  3436.   .| Glob. Var.: buf%
  3437.   .| Ruft auf  : scsicall,hard_err
  3438.   .| Aufruf in : do_part-1,xgm_part-3,
  3439.   scsicall(10,block%,1,0,buf%,6,2)
  3440.   hard_err
  3441. RETURN
  3442. PROCEDURE check_part_beginn   ! PART: letzte Partition ermitteln
  3443.   .| Glob. Var.: max_part%,part%
  3444.   .| Felder    : p_size%(),p_start%()
  3445.   .| Aufruf in : hard_part-1,
  3446.   LOCAL i%
  3447.   i%=max_part%
  3448.   WHILE p_size%(i%)=0 AND i%>1
  3449.     DEC i%
  3450.   WEND
  3451.   part%=i%      ! letzte Partition
  3452.   i%=2
  3453.   WHILE i%<=part%
  3454.     p_start%(i%)=p_start%(i%-1)+p_size%(i%-1)
  3455.     INC i%
  3456.   WEND
  3457. RETURN
  3458. PROCEDURE clr_part(m%,block%) ! Partition löschen
  3459.   .| Glob. Var.: buf%,bps_2%,h_error%,bps%,h_fehler%
  3460.   .| Ruft auf  : mdisk,scsicall,readmot,hard_err,hard_message,lesen,do_list
  3461.   .| Aufruf in : hard_zero-1,make_part-1,
  3462.   LOCAL ab%,anf_fat1%,i%,ph_sektors%,tm%,x1%,a$
  3463.   '
  3464.   mdisk
  3465.   scsicall(8,block%,1,0,buf%,6,4)       ! Bootsektor der Partition lesen
  3466.   bps_2%=@readmot(11)                   ! Bytes pro Sektor !
  3467.   anf_fat1%=@readmot(14)                ! Anzahl reservierter Sektoren
  3468.   x1%=anf_fat1%-1+@readmot(22)*BYTE{buf%+16}+@readmot(17)*32/bps_2%
  3469.   a$=STRING$(bps_2%,0)                  ! Leerstring zum Puffer löschen
  3470.   BMOVE V:a$,buf%,bps_2%                ! String in Buffer
  3471.   CLR a$
  3472.   CLR h_error%
  3473.   ph_sektors%=bps_2%/512
  3474.   tm%=MALLOC(x1%*ph_sektors%)
  3475.   ab%=anf_fat1%*ph_sektors%
  3476.   IF tm%=0 OR x1%*ph_sektors%>127
  3477.     FOR i%=ab% TO ab%+x1%*ph_sektors%-1
  3478.       scsicall(10,block%+i%,1,0,buf%,6,2)     ! FAT+DIR schreiben
  3479.       hard_err
  3480.       EXIT IF h_error%<>0
  3481.     NEXT i%
  3482.   ELSE
  3483.     FOR i%=0 TO x1%-1
  3484.       BMOVE buf%,tm%+i%*bps_2%,bps_2%
  3485.     NEXT i%
  3486.     scsicall(10,block%+ab%,x1%*ph_sektors%,0,tm%,6,2)
  3487.     hard_err
  3488.   ENDIF
  3489.   IF tm%>0
  3490.     ~MFREE(tm%)
  3491.   ENDIF
  3492.   IF h_error%<>0
  3493.     hard_message(h_fehler%)
  3494.   ENDIF
  3495.   lesen
  3496.   do_list
  3497. RETURN
  3498. '
  3499. PROCEDURE do_part_cbhd        ! Partitionen schreiben
  3500.   .| Glob. Var.: part%,e.l%,m%
  3501.   .| Felder    : po_start%(),p_start%(),po_size%(),p_size%()
  3502.   .| Ruft auf  : eingabe,make_part
  3503.   .| Aufruf in : do_part-1,
  3504.   LOCAL a%,i%,mp%
  3505.   i%=1
  3506.   WHILE po_start%(i%)=p_start%(i%) AND po_size%(i%)=p_size%(i%) AND i%<part%
  3507.     INC i%
  3508.   WEND
  3509.   a%=1
  3510.   IF i%<>1
  3511.     a%=@eingabe("Ab Partition",i%)
  3512.   ENDIF
  3513.   IF e.l%>0 OR a%>part%+1 OR a%<1
  3514.     mp%=99
  3515.   ELSE
  3516.     mp%=a%
  3517.   ENDIF
  3518.   '
  3519.   IF mp%<99
  3520.     FOR m%=mp% TO part%
  3521.       IF p_size%(m%)>0
  3522.         make_part(m%)
  3523.       ENDIF
  3524.     NEXT m%
  3525.   ENDIF
  3526. RETURN
  3527. PROCEDURE do_root_cbhd        ! Rootsektor generieren
  3528.   .| Glob. Var.: buf%,ext_magic%,bsl_start%,bsl_count%
  3529.   .| Felder    : p_size%(),p_id$(),p_start%()
  3530.   .| Ruft auf  : clear_root,scsicall,hard_err
  3531.   .| Aufruf in : do_part-1,
  3532.   LOCAL i%,x1%
  3533.   clear_root
  3534.   FOR i%=0 TO 11
  3535.     x1%=buf%+&H1C6+i%*12+(i%>3)*&HA0
  3536.     IF p_size%(i%+1)>0
  3537.       BYTE{x1%}=1                        ! Exist-Flag
  3538.       BMOVE V:p_id$(i%+1),x1%+1,3        ! Kennung
  3539.       {x1%+4}=p_start%(i%+1)             ! Start
  3540.       {x1%+8}=p_size%(i%+1)              ! Size
  3541.     ELSE
  3542.       {x1%}=0                       ! Nicht benützte Partitionen löschen
  3543.       {x1%+4}=0
  3544.       {x1%+8}=0
  3545.     ENDIF
  3546.   NEXT i%
  3547.   BYTE{buf%+&H151}=1                    ! Root-Version 1
  3548.   {buf%+&H152}=ext_magic%               ! --> "CBHD"
  3549.   {buf%+&H1F6}=bsl_start%
  3550.   {buf%+&H1FA}=bsl_count%
  3551.   scsicall(10,0,1,0,buf%,6,2)       ! Schreibe Rootsector
  3552.   hard_err
  3553. RETURN
  3554. ' ----------------------
  3555. PROCEDURE hard_format         ! Platte formatieren
  3556.   .| Glob. Var.: wa$,root$,bps%,buf%,bsl_start%,bsl_count%,bsl$,target%
  3557.   .|     geraet%,platte$,buf2%,hard%,pt%,hi_in%,b.ox%,boxtxt&,boxaktiv&
  3558.   .|     h_fehler%,j%
  3559.   .| Ruft auf  : alrt,no_protekt,root_sec,hard_param,do_mode_select,put_char
  3560.   .|     box_draw,mdisk,scsicall,hard_err,mnorm,box_undraw,hard_message
  3561.   .|     set_root,hdx_bad
  3562.   .| Aufruf in : menu_mess-1,
  3563.   LOCAL a%,b%,c%,i%,t%,a$
  3564.   '
  3565.   IF @alrt(2,"Harddisk formatieren?",0,wa$)=1
  3566.     IF @no_protekt=1
  3567.       root_sec(1)
  3568.       root$=STRING$(bps%,0)
  3569.       BMOVE buf%,V:root$,bps%
  3570.       '
  3571.       bsl_start%=1
  3572.       bsl_count%=1
  3573.       bsl$=STRING$(bps%,0)
  3574.       BYTE{V:bsl$+3}=&HA5       ! Leere BSL generieren
  3575.       ' ----------------
  3576.       IF @alrt(2,"FORMATIEREN  Letzte Chance:|Target:"+STR$(target%)+" Geraet:"+STR$(geraet%)+"| "+platte$,0,wa$)=1
  3577.         hard_param
  3578.         {buf2%}=8               ! Länge der Extent Descriptor List
  3579.         {buf2%+4}=0
  3580.         BYTE{buf2%+8}=0
  3581.         IF hard%<>2
  3582.           do_mode_select
  3583.         ENDIF
  3584.         IF pt%>0
  3585.           b%=pt%*256+2*65536
  3586.         ELSE
  3587.           CLR b%
  3588.         ENDIF
  3589.         b%=b%+(hi_in% DIV 256)
  3590.         c%=hi_in% MOD 256
  3591.         IF hard%=2 OR hard%=3
  3592.           CLR b%
  3593.         ENDIF
  3594.         {buf2%}=0
  3595.         '
  3596.         put_char(b.ox%,boxtxt&,"Festplatte formatieren")
  3597.         put_char(b.ox%,boxaktiv&,platte$)
  3598.         box_draw(b.ox%)
  3599.         mdisk
  3600.         scsicall(4,b%,c%,0,buf%,6,8)    ! Format Drive
  3601.         hard_err
  3602.         mnorm
  3603.         box_undraw(b.ox%)
  3604.         IF h_fehler%<>0
  3605.           hard_message(h_fehler%)
  3606.         ELSE
  3607.           BMOVE V:root$,buf%,bps%       ! Rootsektor zurück in Puffer
  3608.           set_root                      ! Daten rein
  3609.           '                             ! 1 Partition schreiben
  3610.           {buf%+&H1C6}=&H147454D        ! FLAG=1 + "GEM"
  3611.           a%=1                          ! Start normal ab Block 1
  3612.           IF bsl_start%=1
  3613.             a%=bsl_start%+bsl_count%    ! sonst eventuell nach BSL
  3614.           ENDIF
  3615.           {buf%+&H1CA}=a%               ! für P_start(0)
  3616.           {buf%+&H1CE}=255              ! Dummy-Partitions-Länge
  3617.           '
  3618.           FOR t%=buf%+&H156 TO buf%+&H1AE STEP 4
  3619.             {t%}=0
  3620.           NEXT t%
  3621.           FOR t%=buf%+&H1D2 TO buf%+&H1F2 STEP 4
  3622.             {t%}=0
  3623.           NEXT t%                     ! Rest des Rootsektors löschen
  3624.           {buf%+&H1F6}=bsl_start%
  3625.           {buf%+&H1FA}=bsl_count%
  3626.           BYTE{buf%+&H151}=1          ! Root-Version 1
  3627.           IF hard%=2
  3628.             PAUSE 400                 ! Vortex !!
  3629.           ENDIF
  3630.           scsicall(10,0,1,0,buf%,6,2) ! Write Rootsector
  3631.           hard_err
  3632.           ' --------------- BSL schreiben
  3633.           CLR j%
  3634.           FOR i%=bsl_start% TO bsl_start%+bsl_count%-1
  3635.             BMOVE (V:bsl$)+j%,buf%,bps%
  3636.             scsicall(10,i%,1,0,buf%,6,2)
  3637.             ADD j%,bps%
  3638.           NEXT i%
  3639.           CLR bsl$
  3640.           ' ------------------------------
  3641.           hdx_bad       ! zerstörender TEST !
  3642.           ' ------------------------------
  3643.         ENDIF
  3644.       ENDIF
  3645.     ENDIF
  3646.   ENDIF
  3647. RETURN
  3648. '
  3649. PROCEDURE hard_install        ! Plattentreiber installieren
  3650.   .| Glob. Var.: wa$,h_error%,buf%,part%,max_part%,block%,ab%,b$,root.raw%
  3651.   .|     bps%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc%,hi_lz%,hi_rt%,hi_in%,hi_spt%
  3652.   .|     hi_size%,bsl_start%,bsl_count%,ext_magic%,cbhd_found%,boot.raw%,fi$
  3653.   .|     sed_pfad$,f_pexec%,ziel$,punptr%,target%,pfad$
  3654.   .| Felder    : p_block%(),p_flag%(),p_start%(),p_size%()
  3655.   .| Ruft auf  : alrt,no_protekt,root_sec,part_select,scsicall,hard_err
  3656.   .|     do_pexec,pexec,do_file_copy,datei_copy,hard_root
  3657.   .| Aufruf in : menu_mess-1,
  3658.   LOCAL a%,i%,j%,x%,bd$,rx$,root%
  3659.   '
  3660.   IF @alrt(2,"Platte bootbar machen?",1,wa$)=1
  3661.     IF @no_protekt=1
  3662.       REPEAT
  3663.         root_sec(1)
  3664.         EXIT IF h_error%<>0
  3665.         '
  3666.         root%=&H150
  3667.         rx$=STRING$(512-root%,0)
  3668.         BMOVE buf%+root%,V:rx$,LEN(rx$) ! Installieren von altem CBHD-Format
  3669.         '
  3670.         ' ------------------------------
  3671.         part%=@part_select              ! Welche Partition bootbar?
  3672.         EXIT IF part%<=0
  3673.         '
  3674.         IF p_block%(part%)>0
  3675.           ~@alrt(1,"Diese Partition kann nicht|bootfähig gemacht werden. ",1,"Abbruch")
  3676.         ENDIF
  3677.         EXIT IF p_block%(part%)<>0
  3678.         '
  3679.         FOR i%=1 TO max_part%
  3680.           p_flag%(i%)=p_flag%(i%) AND (NOT &H80)
  3681.         NEXT i%
  3682.         p_flag%(part%)=p_flag%(part%) OR &H80
  3683.         ' ------------------------------
  3684.         '
  3685.         block%=p_start%(part%)
  3686.         scsicall(8,block%,1,0,buf%,6,4) ! Bootsektor lesen
  3687.         hard_err
  3688.         EXIT IF h_error%<>0             ! Fehler?
  3689.         '
  3690.         bd$=STRING$(22,0)
  3691.         BMOVE buf%+8,V:bd$,LEN(bd$)     ! wichtige BOOT-Daten retten
  3692.         '
  3693.         ab%=BYTE{buf%+1}                ! xx Bytes nach 60xx retten wegen c't
  3694.         b$=STRING$(ab%,0)
  3695.         BMOVE buf%+2,V:b$,LEN(b$)       ! steht in B$
  3696.         BMOVE root.raw%,buf%,bps%       ! Rootsektor in Puffer rein
  3697.         BMOVE buf%+2,V:b$,LEN(b$)       ! und gerettete Daten (c't)
  3698.         CLR b$
  3699.         BMOVE V:rx$,buf%+root%,LEN(rx$) ! Partinfo wieder rein
  3700.         '
  3701.         CARD{buf%+&H1B6}=hi_cc%         ! Zylinder
  3702.         BYTE{buf%+&H1B8}=hi_dhc%        ! Köpfe
  3703.         CARD{buf%+&H1BA}=hi_rwcc%       ! 1. Spur mit reduziertem Schreibstrom
  3704.         CARD{buf%+&H1BC}=hi_wpc%        !    "    "   Vorkompensation
  3705.         BYTE{buf%+&H1BE}=hi_lz%         ! Breite der Parkzone
  3706.         BYTE{buf%+&H1BF}=hi_rt%         ! Steprate
  3707.         BYTE{buf%+&H1C0}=hi_in%         ! Interleave
  3708.         BYTE{buf%+&H1C1}=hi_spt%        ! Sektoren pro Track
  3709.         {buf%+&H1C2}=hi_size%           ! Größe der Platte
  3710.         {buf%+&H1F6}=bsl_start%         ! BSL
  3711.         {buf%+&H1FA}=bsl_count%         ! BSL
  3712.         BYTE{buf%+&H151}=1              ! Root_vers%
  3713.         {buf%+&H152}=ext_magic%         ! CBHD
  3714.         '
  3715.         IF cbhd_found%>0
  3716.           FOR i%=0 TO 11
  3717.             x%=buf%+&H1C6+i%*12+(i%>3)*&HA0
  3718.             IF p_size%(i%+1)>0
  3719.               BYTE{x%}=p_flag%(i%+1)
  3720.             ELSE
  3721.               BYTE{x%}=0
  3722.             ENDIF
  3723.           NEXT i%
  3724.         ENDIF
  3725.         '
  3726.         ~XBIOS(18,L:buf%,L:-1,-1,1)     ! MAGIC
  3727.         scsicall(10,0,1,0,buf%,6,2)     ! 1. Rootsektor schreiben
  3728.         hard_err
  3729.         IF cbhd_found%=0                ! AHDI 3.0
  3730.           '
  3731.           FOR i%=1 TO max_part%
  3732.             IF p_size%(i%)>0            ! Partition existiert?
  3733.               '
  3734.               block%=p_block%(i%)       ! ROOTSEKTOR lesen
  3735.               scsicall(8,block%,1,0,buf%,6,4)
  3736.               hard_err
  3737.               '
  3738.               IF block%<>0
  3739.                 BYTE{buf%+&H1C6}=p_flag%(i%)     ! FLAG schreiben!!
  3740.               ELSE
  3741.                 FOR j%=0 TO 3                   ! richtigen Eintrag suchen
  3742.                   x%=&H1C6+j%*12
  3743.                   IF {buf%+x%+4}=p_start%(i%)
  3744.                     BYTE{buf%+x%}=p_flag%(i%)
  3745.                   ENDIF
  3746.                 NEXT j%
  3747.               ENDIF
  3748.               IF i%=part%
  3749.                 ~XBIOS(18,L:buf%,L:-1,-1,1)     ! MAGIC
  3750.               ENDIF
  3751.               scsicall(10,block%,1,0,buf%,6,2)  ! Rootsektor schreiben
  3752.               hard_err
  3753.               '
  3754.             ENDIF
  3755.           NEXT i%
  3756.         ENDIF
  3757.         '
  3758.         block%=p_start%(part%)
  3759.         scsicall(8,block%,1,0,buf%,6,4) ! Bootsektor lesen
  3760.         hard_err
  3761.         BMOVE boot.raw%,buf%,bps%       ! Bootprogramm in Puffer
  3762.         BMOVE V:bd$,buf%+8,LEN(bd$)     ! wichtige Daten rein
  3763.         ~XBIOS(18,L:buf%,L:4097*4096,-1,1) ! ausführbar
  3764.         scsicall(10,block%,1,0,buf%,6,2) ! Bootsektor schreiben
  3765.         ' -----------------------------
  3766.         fi$=sed_pfad$+"CBHD.SYS"
  3767.         IF EXIST(fi$)=TRUE
  3768.           do_pexec(fi$)                 ! Treiber starten
  3769.         ELSE
  3770.           pexec                         ! Treiber suchen+starten
  3771.         ENDIF
  3772.         IF f_pexec%<0
  3773.           ~@alrt(1,"Treiber (CBHD.SYS) |bitte selber kopieren",1," OK ")
  3774.         ELSE
  3775.           CLR ziel$
  3776.           punptr%=LPEEK(&H516)
  3777.           FOR i%=0 TO 15
  3778.             x%=BYTE{punptr%+i%+2}
  3779.             EXIT IF x%<>&HFF AND x%=target%
  3780.           NEXT i%
  3781.           IF i%<>16
  3782.             ziel$=CHR$(i%+part%-1+65)+":\"+"CBHD.SYS"
  3783.           ENDIF
  3784.           IF EXIST(fi$)=TRUE AND ziel$<>""
  3785.             do_file_copy(fi$,ziel$)   ! Treiber automatisch kopieren
  3786.           ELSE
  3787.             pfad$="A:\"
  3788.             datei_copy                ! Treiber von Hand kopieren
  3789.           ENDIF
  3790.         ENDIF
  3791.         ' -----------------------------
  3792.       UNTIL 1
  3793.       hard_root
  3794.     ENDIF
  3795.   ENDIF
  3796. RETURN
  3797. PROCEDURE hard_noboot         ! Plattentreiber entfernen
  3798.   .| Glob. Var.: wa$,chk_sum%,h_error%,buf%,h_fehler%
  3799.   .| Ruft auf  : alrt,no_protekt,root_sec,chk_sum,scsicall,hard_err
  3800.   .|     hard_message
  3801.   .| Aufruf in : menu_mess-1,
  3802.   IF @alrt(2,"Booten von der Platte abstellen?",1,wa$)=1
  3803.     IF @no_protekt=1
  3804.       root_sec(1)
  3805.       chk_sum%=@chk_sum
  3806.       IF h_error%=0
  3807.         IF chk_sum%<>&H1234
  3808.           ~@alrt(1,"Platte ist nicht bootfähig!",1," Aha ")
  3809.         ELSE
  3810.           CARD{buf%+510}=(chk_sum%-1) AND &HFFFF
  3811.           scsicall(10,0,1,0,buf%,6,2) ! schreibe Rootsektor
  3812.           hard_err
  3813.         ENDIF
  3814.       ELSE
  3815.         hard_message(h_fehler%)
  3816.       ENDIF
  3817.     ENDIF
  3818.   ENDIF
  3819. RETURN
  3820. '
  3821. PROCEDURE hard_search         ! DMA-Bus durchsuchen
  3822.   .| Glob. Var.: target%,geraet%,erg%,b$,hard%,buf%,h_error%,buf2%,h_fehler%
  3823.   .| Felder    : dma%(),scsi_err$()
  3824.   .| Ruft auf  : clr_out,mtasse,set_hard,scsicall,hard_err,getistr$,out,mnorm
  3825.   .|     out_do,set_last
  3826.   .| Aufruf in : menu_mess-1,
  3827.   LOCAL a%,b%,ab%,a$
  3828.   a%=target%            ! alten Zustand merken
  3829.   b%=geraet%
  3830.   erg%=3
  3831.   b$=STRING$(24,0)
  3832.   clr_out("Platten suchen ...")
  3833.   mtasse
  3834.   FOR target%=0 TO 15
  3835.     FOR geraet%=0 TO 1
  3836.       IF dma%(target%*2+geraet%)>0
  3837.         a$="Target:"+RIGHT$("0"+STR$(target%),2)+"  Gerät:"+STR$(geraet%)+"  "
  3838.         hard%=@set_hard(target%)
  3839.         scsicall(0,0,0,0,buf%,6,0)      ! UNIT READY
  3840.         hard_err
  3841.         IF h_error%=0
  3842.           scsicall(18,0,56,0,buf%,6,5)  ! INQUIRY
  3843.           IF h_error%=0
  3844.             BMOVE buf2%+8,V:b$,24
  3845.             a$=a$+b$
  3846.           ELSE
  3847.             a$=a$+"SASI (Adaptec 4000/4070 o.ä.)"
  3848.           ENDIF
  3849.         ELSE
  3850.           IF h_fehler%>0 AND h_error%<>-8
  3851.             a$=a$+@getistr$(ABS(h_fehler%),0)
  3852.           ELSE
  3853.             a$=a$+scsi_err$(ABS(h_error%))
  3854.           ENDIF
  3855.         ENDIF
  3856.         IF h_error%<>-8
  3857.           out(a$)
  3858.         ENDIF
  3859.       ENDIF
  3860.     NEXT geraet%
  3861.   NEXT target%
  3862.   target%=a%
  3863.   geraet%=b%
  3864.   mnorm
  3865.   out_do
  3866.   set_last(11)
  3867. RETURN
  3868. PROCEDURE last_11             ! Target/Gerät auswählen
  3869.   .| Glob. Var.: target%,geraet%,top%,txt_zeile%,out%,hard%
  3870.   .| Felder    : whdl&(),out$()
  3871.   .| Ruft auf  : wind_top,lesen,set_hard,mdisk,hard_root
  3872.   .| Aufruf in : maus_pos-1,
  3873.   LOCAL a%,b%,a$
  3874.   '
  3875.   target%=a%
  3876.   geraet%=b%
  3877.   IF top%+txt_zeile%>=out%      ! wenn Abbruch
  3878.     target%=a%
  3879.     geraet%=b%
  3880.     wind_top(whdl&(0))
  3881.     lesen
  3882.   ELSE
  3883.     a$=out$(top%+txt_zeile%)
  3884.     IF LEFT$(a$,7)="Target:"
  3885.       target%=VAL(MID$(a$,8,2))
  3886.       geraet%=VAL(MID$(a$,18,1))
  3887.       hard%=@set_hard(target%)
  3888.       mdisk
  3889.       hard_root
  3890.     ENDIF
  3891.   ENDIF
  3892. RETURN
  3893. '
  3894. PROCEDURE hard_save           ! ROOT-und alle BOOT-Sektoren speichern
  3895.   .| Glob. Var.: h_error%,pfad$,erg%,device%,hdl%,buf%,bps%,part_total%,block%
  3896.   .|     fehler%,h_fehler%
  3897.   .| Felder    : p_start%(),p_size%()
  3898.   .| Ruft auf  : root_sec,dev,fwrite2,mtasse,lesen,fclose,mnorm,do_list
  3899.   .|     hard_message
  3900.   .| Aufruf in : menu_mess-1,
  3901.   LOCAL a$,i%
  3902.   root_sec(1)
  3903.   IF h_error%=0
  3904.     pfad$="A:\"
  3905.     erg%=1
  3906.     dev("Format speichern",31)
  3907.     IF device%<>99
  3908.       fwrite2(hdl%,buf%,bps%)
  3909.       mtasse
  3910.       FOR i%=0 TO part_total%
  3911.         IF p_start%(i%)<>0 AND p_size%(i%)<>0
  3912.           block%=p_start%(i%)
  3913.           lesen
  3914.           fwrite2(hdl%,buf%,bps%)
  3915.           IF fehler%<0
  3916.             i%=part_total%+1
  3917.           ENDIF
  3918.         ENDIF
  3919.       NEXT i%
  3920.       ~@fclose(hdl%)
  3921.       mnorm
  3922.       do_list
  3923.     ENDIF
  3924.   ELSE
  3925.     hard_message(h_fehler%)
  3926.   ENDIF
  3927. RETURN
  3928. PROCEDURE hard_restore        ! ..... restaurieren
  3929.   .| Glob. Var.: h_error%,wa$,a$,target%,geraet%,root$,bps%,buf%,max_part%
  3930.   .|     fhandle%,fehler%,block%,part_total%,erg%,h_fehler%
  3931.   .| Felder    : po_size%(),p_size%(),po_start%(),p_start%()
  3932.   .| Ruft auf  : root_sec,alrt,fsel$,do_list,fopen,fread2,scsicall,hard_err
  3933.   .|     fclose,hard_message
  3934.   .| Aufruf in : menu_mess-1,
  3935.   LOCAL i%,hf$
  3936.   root_sec(1)
  3937.   IF h_error%=0
  3938.     IF @alrt(1,"HDX-RESTORE|"+STRING$(27,"-")+"  |ACHTUNG: Bootsektoren|werden überschrieben! ",1,wa$)=1
  3939.       a$="HDX_SAVE."+STR$(target%)+STR$(geraet%)
  3940.       hf$=@fsel$("*.*",a$,"HDX-SAVE Datei laden",2)
  3941.       IF EXIST(hf$)=TRUE
  3942.         root$=STRING$(bps%,0)
  3943.         BMOVE buf%,V:root$,bps%   ! auch Rootsektor retten
  3944.         do_list
  3945.         FOR i%=1 TO max_part%
  3946.           po_size%(i%)=p_size%(i%)
  3947.           po_start%(i%)=p_start%(i%)
  3948.         NEXT i%
  3949.         '
  3950.         fhandle%=@fopen(hf$,0)
  3951.         IF fhandle%>5
  3952.           fread2(fhandle%,buf%,bps%)
  3953.           '
  3954.           IF fehler%>=0
  3955.             CLR block%
  3956.             IF @alrt(2,"Rootsektor schreiben?",0,"Ja| Nein ")=1
  3957.               scsicall(10,block%,1,0,buf%,6,2)
  3958.               hard_err
  3959.             ENDIF
  3960.             root_sec(1)
  3961.             '
  3962.             FOR i%=0 TO part_total%
  3963.               IF p_start%(i%)<>0 AND p_size%(i%)<>0
  3964.                 erg%=1
  3965.                 IF po_start%(i%)<>p_start%(i%)
  3966.                   a$="Unterschied festgestellt:|Start Alt: "+STR$(po_start%(i%))+"|      Neu: "+STR$(p_start%(i%))
  3967.                   erg%=@alrt(2,a$,0,"Schreiben|Next|Abbruch")
  3968.                 ENDIF
  3969.                 IF erg%=1
  3970.                   IF @alrt(2,"Rootsektor restaurieren?",0,"Ja| Nein ")=1
  3971.                     BMOVE V:root$,buf%,LEN(root$)
  3972.                     CLR block%
  3973.                     scsicall(10,block%,1,0,buf%,6,2)
  3974.                     hard_err
  3975.                   ENDIF
  3976.                 ENDIF
  3977.                 '
  3978.                 block%=p_start%(i%)
  3979.                 fread2(fhandle%,buf%,bps%)
  3980.                 IF fehler%<0
  3981.                   i%=part_total%+1
  3982.                 ELSE
  3983.                   erg%=@alrt(2,"Bootsektor "+STR$(i%+1)+" schreiben?",0,"Ja|Nein|Abbruch")
  3984.                   IF erg%=1
  3985.                     scsicall(10,block%,1,0,buf%,6,2)
  3986.                     hard_err
  3987.                   ELSE
  3988.                     IF erg%=3
  3989.                       i%=part_total%+1
  3990.                     ENDIF
  3991.                   ENDIF
  3992.                 ENDIF
  3993.               ENDIF
  3994.             NEXT i%
  3995.             '
  3996.           ENDIF
  3997.           ~@fclose(fhandle%)
  3998.         ENDIF
  3999.       ENDIF
  4000.     ENDIF
  4001.   ELSE
  4002.     hard_message(h_fehler%)
  4003.   ENDIF
  4004. RETURN
  4005. '
  4006. PROCEDURE hdx_bad             ! BAD-Test manuell
  4007.   .| Glob. Var.: platte$,wa$,target%,geraet%
  4008.   .| Ruft auf  : alrt,no_protekt,hard_bad
  4009.   .| Aufruf in : hard_format-1,menu_mess-1,
  4010.   IF @alrt(4,"Platte: "+platte$+"|ACHTUNG: zerstörender SCHREIB-TEST!|Daten gehen rettungslos verloren!!",0,wa$)=1
  4011.     IF @no_protekt=1
  4012.       IF @alrt(2,"SCHREIB-TEST  Letzte Chance:|Target:"+STR$(target%)+" Gerät:"+STR$(geraet%)+"| "+platte$,0,wa$)=1
  4013.         hard_bad
  4014.       ENDIF
  4015.     ENDIF
  4016.   ENDIF
  4017. RETURN
  4018. PROCEDURE hard_bad            ! zerstörendes BAD nach formatieren
  4019.   .| Glob. Var.: erg%,hard%,h_error%,bps%,buf%,bsl$,hi_spt%,hi_dhc%,b.ox%
  4020.   .|     boxtxt&,boxaktiv&,block%,abb%,bad%,hi_size%,utis%,bdr%,s%,bsl_start%
  4021.   .|     bsl_count%,h_fehler%
  4022.   .| Ruft auf  : clr_out,out,root_sec,alrt,put_char,box_draw,objc_update
  4023.   .|     scsicall,was_ist,box_undraw,mdisk,hard_err,inc_bad_err,lesen,out_do
  4024.   .|     do_list,hard_message
  4025.   .| Aufruf in : hdx_bad-1,
  4026.   LOCAL a%,ab%,i%,j%,tm%,tm2%,x1%,zgr%,a$,dp$,root$
  4027.   '
  4028.   erg%=3
  4029.   clr_out("Defektliste erstellen:")
  4030.   out("")
  4031.   IF hard%<2
  4032.     dp$=CHR$(&H6C)+CHR$(&HDB)   ! Testmuster für MFM-Platten
  4033.   ELSE
  4034.     dp$=CHR$(&H63)+CHR$(&H33)   !   "         "  RLL-Platten
  4035.   ENDIF
  4036.   root_sec(1)
  4037.   IF h_error%=0
  4038.     root$=STRING$(bps%,0)         ! Rootsektor retten
  4039.     BMOVE buf%,V:root$,bps%
  4040.     '
  4041.     bsl$=STRING$(bps%*2,0)        ! Leere BSL
  4042.     '
  4043.     x1%=MIN(127,hi_spt%*hi_dhc%)  ! max 127 !! Sek./Track
  4044.     tm%=MALLOC(x1%*bps%*2)        ! 2*Speicher holen
  4045.     IF tm%=0
  4046.       ~@alrt(3,"Kein Speicher für |'Test-Muster schreiben'",1,"Abbruch")
  4047.     ENDIF
  4048.     WHILE tm%>0
  4049.       tm2%=tm%+x1%*bps%           ! Lesepufferadresse
  4050.       '
  4051.       ' -------------------------
  4052.       put_char(b.ox%,boxtxt&,"Testmuster schreiben ...")
  4053.       put_char(b.ox%,boxaktiv&,"Rest:     ")
  4054.       box_draw(b.ox%)             ! Anwender beruhigen
  4055.       '
  4056.       a$=STRING$(bps%/2,dp$)      ! Testmusterstring
  4057.       BMOVE V:a$,buf%,bps%        ! String in Buffer
  4058.       CLR a$
  4059.       FOR i%=0 TO x1%-1
  4060.         BMOVE buf%,tm%+i%*bps%,bps% ! Puffer in Schreib-RAM kopieren
  4061.       NEXT i%
  4062.       '
  4063.       CLR block%,abb%,bad%
  4064.       DO
  4065.         put_char(b.ox%,boxaktiv&,"Rest: "+STR$(hi_size%-block%))
  4066.         objc_update(b.ox%,boxaktiv&)
  4067.         '
  4068.         scsicall(10,block%,x1%,0,tm%,6,2) ! Muster auf Platte schreiben
  4069.         ADD block%,x1%
  4070.         EXIT IF block%>=hi_size%
  4071.         abb%=@was_ist
  4072.         EXIT IF abb%>0
  4073.         IF block%+x1%>hi_size%
  4074.           block%=hi_size%-x1%
  4075.         ENDIF
  4076.       LOOP
  4077.       IF abb%>0
  4078.         box_undraw(b.ox%)
  4079.       ENDIF
  4080.       ' ----------------------------------
  4081.       '
  4082.       IF abb%=0                           ! Schreiben durchgelaufen?
  4083.         zgr%=6                            ! die ersten 6 Bytes sind belegt
  4084.         CLR block%                        ! Defekt, und Block löschen
  4085.         '
  4086.         put_char(b.ox%,boxtxt&,"Testmuster lesen ...")
  4087.         objc_update(b.ox%,boxtxt&)
  4088.         '
  4089.         a$=STRING$(bps%/4,"CBHD")
  4090.         DO
  4091.           put_char(b.ox%,boxaktiv&,"Rest: "+STR$(hi_size%-block%))
  4092.           objc_update(b.ox%,boxaktiv&)
  4093.           '
  4094.           BMOVE V:a$,buf%,bps%            ! String in Puffer
  4095.           FOR i%=0 TO x1%-1
  4096.             BMOVE buf%,tm2%+i%*bps%,bps%  ! Puffer in LESE-RAM kopieren
  4097.           NEXT i%
  4098.           mdisk
  4099.           scsicall(8,block%,x1%,0,tm2%,6,4) ! und LESEN
  4100.           hard_err
  4101.           '
  4102.           IF C:utis%(&H500,L:tm%,L:tm2%,L:(x1%*bps%)/4-1)<>0 OR h_error%<>0
  4103.             CLR bdr%
  4104.             '
  4105.             FOR i%=0 TO x1%-1             ! Fehler?
  4106.               IF C:utis%(&H500,L:tm%,L:tm2%+i%*bps%,L:bps%/4-1)<>0
  4107.                 inc_bad_err(block%+i%)
  4108.                 bdr%=1
  4109.               ENDIF
  4110.             NEXT i%
  4111.             '
  4112.             IF bdr%=0             ! wenn da kein Fehler gefunden
  4113.               FOR i%=0 TO x1%
  4114.                 scsicall(8,block%+i%,1,0,tm2%,6,4) ! einzeln lesen
  4115.                 hard_err
  4116.                 IF h_error%<>0
  4117.                   inc_bad_err(block%+i%)
  4118.                   bdr%=1
  4119.                 ENDIF
  4120.               NEXT i%
  4121.               '
  4122.               IF bdr%=0
  4123.                 ~@alrt(1,"Konnte defekten Block nicht lokalisieren.",1," Dumm ")
  4124.               ENDIF
  4125.             ENDIF
  4126.             '
  4127.           ENDIF
  4128.           ADD block%,x1%
  4129.           EXIT IF block%>=hi_size%        ! Fertig?
  4130.           '
  4131.           IF block%+x1%>hi_size%
  4132.             block%=hi_size%-x1%
  4133.           ENDIF
  4134.           EXIT IF @was_ist>0        ! Abbruch?
  4135.         LOOP
  4136.         box_undraw(b.ox%)           ! ja,
  4137.         ~MFREE(tm%)                 ! Speicher freigeben
  4138.       ENDIF
  4139.       '
  4140.       ' ---------------   BSL schreiben
  4141.       '
  4142.       out("Anzahl der defekten Blocks: "+STR$(bad%))
  4143.       out("")
  4144.       BYTE{V:bsl$}=(bad% AND &HFF0000)/65536
  4145.       BYTE{V:bsl$+1}=(bad% AND &HFF00)/256
  4146.       BYTE{V:bsl$+2}=(bad% AND &HFF)      ! Anzahl der Defekte
  4147.       '
  4148.       CLR s%                              ! Prüfsumme berechnen
  4149.       FOR i%=0 TO bad%+2*3
  4150.         ADD s%,BYTE{(V:bsl$)+i%}
  4151.       NEXT i%
  4152.       BYTE{V:bsl$+3}=&HA5-(s% AND &HFF)   ! auf &HA5
  4153.       '
  4154.       bsl_start%=1
  4155.       bsl_count%=((bad%+2)*3)/bps%+1      ! Länge BSL berechnen
  4156.       CLR j%
  4157.       FOR block%=bsl_start% TO bsl_start%+bsl_count%-1
  4158.         BMOVE (V:bsl$)+j%,buf%,bps%
  4159.         scsicall(10,block%,1,0,buf%,6,2)  ! BSL schreiben
  4160.         ADD j%,bps%
  4161.       NEXT block%
  4162.       CLR bsl$
  4163.       '
  4164.       BMOVE V:root$,buf%,LEN(root$)
  4165.       {buf%+&H1F6}=bsl_start%
  4166.       {buf%+&H1FA}=bsl_count%
  4167.       scsicall(10,0,1,0,buf%,6,2)         ! Write Rootsector
  4168.       hard_err
  4169.       lesen
  4170.       out_do
  4171.       EXIT IF 1
  4172.     WEND
  4173.     do_list
  4174.   ELSE
  4175.     hard_message(h_fehler%)
  4176.   ENDIF
  4177. RETURN
  4178. PROCEDURE inc_bad_err(nr%)    ! BAD-Fehler
  4179.   .| Glob. Var.: bad%,bsl$,zgr%
  4180.   .| Ruft auf  : out
  4181.   .| Aufruf in : hard_bad-2,
  4182.   IF bad%<(LEN(bsl$)/3)-2
  4183.     out("Block:"+STR$(nr%)+" defekt ...")
  4184.     BYTE{V:bsl$+zgr%}=(nr% AND &HFF0000)/65536
  4185.     BYTE{V:bsl$+zgr%+1}=(nr% AND &HFF00)/256
  4186.     BYTE{V:bsl$+zgr%+2}=(nr% AND &HFF)
  4187.     ADD zgr%,3
  4188.     INC bad%
  4189.   ENDIF
  4190. RETURN
  4191. '
  4192. PROCEDURE hdx_set_bad
  4193.   .| Glob. Var.: bsl_start%,bsl_count%,wa$
  4194.   .| Ruft auf  : root_sec,alrt,hard_set_bad
  4195.   .| Aufruf in : menu_mess-1,
  4196.   root_sec(1)
  4197.   IF @alrt(2,"BAD-SEKTOR-LIST abarbeiten?|Start:"+STR$(bsl_start%)+"|Länge:"+STR$(bsl_count%),1,wa$)=1
  4198.     hard_set_bad
  4199.   ENDIF
  4200. RETURN
  4201. PROCEDURE hard_set_bad        ! BAD Sektor-List abarbeiten (in FAT eintragen)
  4202.   .| Glob. Var.: abb%,h_error%,bps%,bsl_start%,bsl_count%,hi_size%,buf%,block%
  4203.   .| Ruft auf  : check_bsl,scsicall,hard_err,out,do_mark_bad
  4204.   .| Aufruf in : hard_zero-1,hard_part-1,hdx_set_bad-1,
  4205.   LOCAL h_def%,si%,j%,zgr%,bsl$
  4206.   '
  4207.   abb%=@check_bsl
  4208.   IF h_error%=0 AND abb%=0
  4209.     bsl$=STRING$(bps%,0)
  4210.     FOR si%=bsl_start% TO bsl_start%+bsl_count%-1
  4211.       EXIT IF si%>hi_size%
  4212.       scsicall(8,si%,1,0,buf%,6,4)       ! X.BSL-Block lesen
  4213.       hard_err
  4214.       EXIT IF h_error%<>0
  4215.       BMOVE buf%,V:bsl$,bps%
  4216.       zgr%=V:bsl$
  4217.       IF si%=bsl_start%
  4218.         h_def%=BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2}
  4219.         ADD zgr%,3
  4220.         ADD zgr%,3
  4221.       ENDIF
  4222.       EXIT IF h_def%=0
  4223.       '
  4224.       FOR j%=1 TO h_def%
  4225.         block%=(BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2})
  4226.         out("Block:"+STR$(block%))
  4227.         ADD zgr%,3
  4228.         do_mark_bad(block%)
  4229.       NEXT j%
  4230.       '         Jetzt Anwenderliste durchgehen
  4231.       block%=(BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2})
  4232.       WHILE block%
  4233.         ADD zgr%,3
  4234.         do_mark_bad(block%)
  4235.         block%=(BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2})
  4236.       WEND
  4237.       '
  4238.       EXIT IF abb%>0
  4239.     NEXT si%
  4240.   ENDIF
  4241. RETURN
  4242. PROCEDURE do_mark_bad(block%) ! defekten Block in FAT eintragen
  4243.   .| Glob. Var.: part_total%,hi_size%,buf%,h_error%,abb%
  4244.   .| Felder    : p_start%(),p_size%()
  4245.   .| Ruft auf  : scsicall,hard_err,readintel,alrt,lesen
  4246.   .| Aufruf in : hard_set_bad-2,
  4247.   LOCAL a%,bl%,part%,hbps%,anf_dat%,ph_sp_ls%,fat_anz%
  4248.   LOCAL anf_fat1%,len_dir%,len_fat%,spc%,lgs%,cluster%,x%
  4249.   '
  4250.   CLR part%
  4251.   DO
  4252.     INC part%
  4253.     EXIT IF ((block%>=p_start%(part%) AND block%<=p_start%(part%)+p_size%(part%))) OR part%>part_total%
  4254.   LOOP
  4255.   '
  4256.   IF part%<=part_total% AND block%<hi_size%
  4257.     '
  4258.     scsicall(8,p_start%(part%),1,0,buf%,6,4)    ! Bootsektor lesen
  4259.     hard_err
  4260.     IF h_error%=0
  4261.       '
  4262.       hbps%=@readintel(12)
  4263.       spc%=BYTE{buf%+13}
  4264.       anf_fat1%=@readintel(15)                  ! Anzahl reservierter Sektoren
  4265.       len_dir%=@readintel(18)*32/hbps%
  4266.       len_fat%=@readintel(23)
  4267.       fat_anz%=BYTE{buf%+16}
  4268.       ph_sp_ls%=hbps%/512                       ! physikalische Sektoren pro logischem Sektor
  4269.       '
  4270.       lgs%=block%-p_start%(part%)
  4271.       anf_dat%=anf_fat1%+len_fat%*fat_anz%+len_dir%
  4272.       cluster%=MAX(0,INT((lgs%-anf_dat%)/spc%)+2)
  4273.       block%=anf_fat1%*ph_sp_ls%+cluster%*2/512
  4274.       ADD block%,p_start%(part%)
  4275.       '
  4276.       scsicall(8,block%,1,0,buf%,6,4)           ! FAT-Sektor lesen
  4277.       hard_err
  4278.       IF h_error%=0
  4279.         a%=cluster%*2
  4280.         WHILE a%>=512
  4281.           SUB a%,512
  4282.         WEND
  4283.         BYTE{buf%+a%}=(&HFFF7 AND &HFF)          ! &HFFF7 = defekt
  4284.         BYTE{buf%+a%+1}=(&HFFF7 AND &HFF00)/256
  4285.         scsicall(10,block%,1,0,buf%,6,2)         ! FAT-Sektor schreiben
  4286.         hard_err
  4287.         x%=len_fat%
  4288.         WHILE fat_anz%>1
  4289.           scsicall(10,block%+x%*ph_sp_ls%,1,0,buf%,6,2) ! x. FAT schreiben
  4290.           hard_err
  4291.           EXIT IF h_error%<>0
  4292.           ADD x%,len_fat%
  4293.           DEC fat_anz%
  4294.         WEND
  4295.       ENDIF
  4296.     ENDIF
  4297.   ELSE
  4298.     ~@alrt(1,"Block:"+STR$(block%)+" nicht gefunden!",1,"Abbruch")
  4299.   ENDIF
  4300.   lesen
  4301.   IF h_error%<>0
  4302.     abb%=1
  4303.   ENDIF
  4304. RETURN
  4305. FUNCTION check_bsl            ! BSL-Struktur testen
  4306.   .| Glob. Var.: bsl_count%,bsl_start%,h_error%
  4307.   .| Ruft auf  : scsicall,hard_err,alrt
  4308.   .| Aufruf in : hard_set_bad-1,
  4309.   LOCAL abb%,bsl%,s%,i%
  4310.   '
  4311.   abb%=1
  4312.   bsl%=MALLOC(bsl_count%*512)
  4313.   IF bsl%>0 AND bsl_count%<32 AND bsl_start%<5
  4314.     scsicall(8,bsl_start%,bsl_count%,0,bsl%,6,4) ! BSL komplett lesen
  4315.     hard_err
  4316.     IF h_error%=0
  4317.       CLR s%                            ! Prüfsumme berechnen
  4318.       FOR i%=bsl% TO bsl%+bsl_count%*512-1
  4319.         ADD s%,BYTE{i%}
  4320.       NEXT i%
  4321.       IF (s% AND &HFF)<>&HA5
  4322.         ~@alrt(3,"BSL-Prüfsumme falsch!|Evtl. neu Formatieren.",1," Aha ")
  4323.       ELSE
  4324.         CLR abb%
  4325.       ENDIF
  4326.     ENDIF
  4327.   ELSE
  4328.     ~@alrt(1,"Mit dieser BSL kann ich nix anfangen.|Bitte formatieren!",1,"Abbruch")
  4329.   ENDIF
  4330.   ~MFREE(bsl%)
  4331.   RETURN abb%
  4332. ENDFUNC
  4333. '
  4334. PROCEDURE do_mode_sense       ! MODE SENSE ausführen
  4335.   .| Glob. Var.: hard%,buf%,hi_bps%,buf2%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc%
  4336.   .|     hi_lz%,hi_rt%,hi_spt%,hi_size%,platte$,hi_in%,bps%
  4337.   .| Felder    : hd_typ$()
  4338.   .| Ruft auf  : scsicall,cbps
  4339.   .| Aufruf in : hard_mode_sense-1,get_root_info-1,root_sec-1,hard_on-1,
  4340.   LOCAL i%,a$
  4341.   IF hard%<>2
  4342.     IF hard%=3
  4343.       scsicall(26,4*256,32,0,buf%,6,5)  ! Mode Sense Page 4
  4344.     ELSE
  4345.       scsicall(26,0,24,0,buf%,6,5)      ! Mode Sense
  4346.     ENDIF
  4347.     hi_bps%=BYTE{buf2%+9}*65536+BYTE{buf2%+10}*256+BYTE{buf2%+11}
  4348.     hi_cc%=BYTE{buf2%+13}*256+BYTE{buf2%+14}
  4349.     hi_dhc%=BYTE{buf2%+15}
  4350.     hi_rwcc%=CARD{buf2%+16}
  4351.     hi_wpc%=CARD{buf2%+18}
  4352.     hi_lz%=BYTE{buf2%+20}
  4353.     hi_rt%=BYTE{buf2%+21}
  4354.     hi_spt%=BYTE{buf2%+23}
  4355.     hi_size%=hi_cc%*hi_dhc%*hi_spt%
  4356.     '
  4357.     IF hard%=3
  4358.       hi_cc%=BYTE{buf2%+14}*65536+BYTE{buf2%+15}*256+BYTE{buf2%+16}
  4359.       hi_size%=BYTE{buf2%+5}*65536+BYTE{buf2%+6}*256+BYTE{buf2%+7}
  4360.       hi_dhc%=BYTE{buf2%+17}
  4361.       hi_rt%=CARD{buf2%+24}
  4362.       '
  4363.       scsicall(18,0,56,0,buf%,6,5)      ! Inquiry
  4364.       platte$=STRING$(24,0)
  4365.       BMOVE buf2%+8,V:platte$,24
  4366.       scsicall(26,3*256,36,0,buf%,6,5)  ! Mode Sense Page 3
  4367.       '
  4368.       hi_bps%=BYTE{buf2%+9}*65536+BYTE{buf2%+10}*256+BYTE{buf2%+11}
  4369.       hi_spt%=BYTE{buf2%+22}*256+BYTE{buf2%+23}
  4370.       IF hi_bps%<>CARD{buf2%+24}
  4371.         IF hi_bps%<>0 AND CARD{buf2%+24}<>0
  4372.           hi_spt%=hi_spt%/(hi_bps%/CARD{buf2%+24})
  4373.         ENDIF
  4374.       ENDIF
  4375.       IF hi_spt%=0 AND hi_cc%<>0 AND hi_dhc%<>0
  4376.         hi_spt%=hi_size%/hi_cc%/hi_dhc%
  4377.       ENDIF
  4378.       hi_in%=BYTE{buf2%+26}*256+BYTE{buf2%+27}
  4379.       hi_rwcc%=hi_cc%+1
  4380.       hi_wpc%=hi_cc%+1
  4381.     ELSE
  4382.       platte$=hd_typ$(hard%)
  4383.     ENDIF
  4384.   ELSE
  4385.     platte$=hd_typ$(hard%)
  4386.     hi_bps%=512
  4387.   ENDIF
  4388.   bps%=hi_bps%
  4389.   cbps
  4390. RETURN
  4391. PROCEDURE hard_param          ! Plattenparameter
  4392.   .| Glob. Var.: h_error%,hard.para%,par1&,hi_bps%,par2&,hi_cc%,par3&,hi_dhc%
  4393.   .|     par4&,hi_spt%,par5&,hi_in%,par6&,hi_rwcc%,par7&,hi_wpc%,par8&,hi_lz%
  4394.   .|     par9&,hi_rt%,par10&,hardname&,platte$,paraok&,pt%,hi_size%,h_fehler%
  4395.   .| Ruft auf  : hard_err,put_wert,put_char,box_draw,form_do,clr_state
  4396.   .|     box_undraw,get_val,hard_message
  4397.   .| Aufruf in : show_hard_data-1,hard_mode_select-1,hard_format-1
  4398.   .|     get_root_info-1,
  4399.   LOCAL ex_obj&
  4400.   hard_err
  4401.   IF h_error%=0
  4402.     put_wert(hard.para%,par1&,hi_bps%,5)
  4403.     put_wert(hard.para%,par2&,hi_cc%,5)
  4404.     put_wert(hard.para%,par3&,hi_dhc%,5)
  4405.     put_wert(hard.para%,par4&,hi_spt%,5)
  4406.     put_wert(hard.para%,par5&,hi_in%,5)
  4407.     put_wert(hard.para%,par6&,hi_rwcc%,5)
  4408.     put_wert(hard.para%,par7&,hi_wpc%,5)
  4409.     put_wert(hard.para%,par8&,hi_lz%,5)
  4410.     put_wert(hard.para%,par9&,hi_rt%,5)
  4411.     put_char(hard.para%,par10&,"$CB")
  4412.     put_char(hard.para%,hardname&,LEFT$(platte$,20))
  4413.     '
  4414.     box_draw(hard.para%)
  4415.     ex_obj&=@form_do(hard.para%) AND &HFF
  4416.     clr_state(hard.para%,ex_obj&,1)
  4417.     box_undraw(hard.para%)
  4418.     IF ex_obj&=paraok&
  4419.       hi_bps%=@get_val(hard.para%,par1&)
  4420.       hi_cc%=@get_val(hard.para%,par2&)
  4421.       hi_dhc%=@get_val(hard.para%,par3&)
  4422.       hi_spt%=@get_val(hard.para%,par4&)
  4423.       hi_in%=@get_val(hard.para%,par5&)
  4424.       hi_rwcc%=@get_val(hard.para%,par6&)
  4425.       hi_wpc%=@get_val(hard.para%,par7&)
  4426.       hi_lz%=@get_val(hard.para%,par8&)
  4427.       hi_rt%=@get_val(hard.para%,par9&)
  4428.       pt%=@get_val(hard.para%,par10&)
  4429.       hi_size%=MIN(2.14748E+09,hi_cc%*hi_dhc%*hi_spt%)
  4430.     ENDIF
  4431.   ELSE
  4432.     hard_message(h_fehler%)
  4433.   ENDIF
  4434. RETURN
  4435. PROCEDURE do_mode_select      ! MODE SELECT
  4436.   .| Glob. Var.: h_error%,hard%,buf2%,bps%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc%
  4437.   .|     hi_lz%,hi_rt%,hi_spt%,buf%
  4438.   .| Ruft auf  : cbps,scsicall,hard_err
  4439.   .| Aufruf in : hard_mode_select-1,hard_format-1,
  4440.   IF h_error%=0
  4441.     IF hard%<>3
  4442.       cbps
  4443.       BYTE{buf2%+9}=(bps% AND &HFF0000) DIV 65536  ! Sektorgröße high
  4444.       BYTE{buf2%+10}=(bps% AND &HFF00) DIV 256     !   '     '   mid
  4445.       BYTE{buf2%+11}=(bps% AND &HFF)               !   '     '   low
  4446.       BYTE{buf2%+12}=1                     ! List Format
  4447.       BYTE{buf2%+13}=hi_cc% DIV 256        ! Anzahl der Zylinder
  4448.       BYTE{buf2%+14}=hi_cc% MOD 256
  4449.       BYTE{buf2%+15}=hi_dhc%               ! Anzahl der Köpfe
  4450.       BYTE{buf2%+16}=hi_rwcc% DIV 256      ! Reduzierter Schreibstrom
  4451.       BYTE{buf2%+17}=hi_rwcc% MOD 256      ! ab Zylinder Hi_rwcc
  4452.       BYTE{buf2%+18}=hi_wpc% DIV 256       ! Vorkompensation ab
  4453.       BYTE{buf2%+19}=hi_wpc% MOD 256       ! Zylinder Hi_wpc
  4454.       BYTE{buf2%+20}=hi_lz%                ! Abstand der Parkspur
  4455.       BYTE{buf2%+21}=hi_rt%                ! Seekrate
  4456.       CARD{buf2%+22}=hi_spt%               ! Sektoren pro Track
  4457.       IF hard%<>2
  4458.         scsicall(&H15,0,24,0,buf%,6,2)  ! MODE SELECT
  4459.         hard_err
  4460.       ENDIF
  4461.     ENDIF
  4462.   ENDIF
  4463. RETURN
  4464. PROCEDURE set_root            ! Plattendaten in ROOT-Sektor schreiben
  4465.   .| Glob. Var.: buf%
  4466.   .| Ruft auf  : set_rootdaten
  4467.   .| Aufruf in : hard_part-1,hard_format-1,
  4468.   LOCAL a%,i&
  4469.   set_rootdaten
  4470.   CLR a%
  4471.   FOR i&=0 TO 510 STEP 2
  4472.     ADD a%,CARD{buf%+i&}               ! Alle Worte zusammenzählen
  4473.   NEXT i&
  4474.   CARD{buf%+&H1FE}=&H1234-a%           ! Checksumme muß $1234 sein
  4475. RETURN
  4476. PROCEDURE set_rootdaten
  4477.   .| Glob. Var.: buf%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc%,hi_lz%,hi_rt%,hi_in%
  4478.   .|     hi_spt%,hi_size%,bsl_start%,bsl_count%
  4479.   .| Aufruf in : clear_root-1,set_root-1,
  4480.   BYTE{buf%+&H151}=1                    ! Root-Version 1
  4481.   CARD{buf%+&H1B6}=hi_cc%               ! Zylinder
  4482.   BYTE{buf%+&H1B8}=hi_dhc%              ! Köpfe
  4483.   CARD{buf%+&H1BA}=hi_rwcc%             ! First cyl with reduced write current
  4484.   CARD{buf%+&H1BC}=hi_wpc%              !   '    '  with precompensation
  4485.   BYTE{buf%+&H1BE}=hi_lz%               ! Breite der Parkzone
  4486.   BYTE{buf%+&H1BF}=hi_rt%               ! Steprate
  4487.   BYTE{buf%+&H1C0}=hi_in%               ! Interleave
  4488.   BYTE{buf%+&H1C1}=hi_spt%              ! Sektoren pro Track
  4489.   IF hi_size%=0
  4490.     hi_size%=hi_cc%*hi_dhc%*hi_spt%
  4491.   ENDIF
  4492.   {buf%+&H1C2}=hi_size%         ! Größe der Platte
  4493.   {buf%+&H1F6}=bsl_start%       ! Bad Sektor List
  4494.   {buf%+&H1FA}=bsl_count%       ! Bad Sektor Count
  4495. RETURN
  4496. PROCEDURE get_root_info       ! Für HARD - PART
  4497.   .| Glob. Var.: max_part%,h_error%
  4498.   .| Felder    : po_size%(),p_size%(),po_start%(),p_start%()
  4499.   .| Ruft auf  : root_sec,do_mode_sense,hard_err,hard_param,do_list
  4500.   .| Aufruf in : hard_part-1,
  4501.   LOCAL i%
  4502.   root_sec(1)
  4503.   FOR i%=1 TO max_part%
  4504.     po_size%(i%)=p_size%(i%)
  4505.     po_start%(i%)=p_start%(i%)
  4506.   NEXT i%
  4507.   do_mode_sense
  4508.   hard_err
  4509.   IF h_error%=0
  4510.     hard_param
  4511.     do_list
  4512.   ENDIF
  4513. RETURN
  4514. '
  4515. PROCEDURE hard_unit
  4516.   .| Ruft auf  : sel_target_geraet
  4517.   .| Aufruf in : stat_line-2,
  4518.   sel_target_geraet
  4519. RETURN
  4520. PROCEDURE sel_target_geraet   ! Target+Gerät einstellen
  4521.   .| Glob. Var.: t.arget%,tgok&,tgabb&,tgwahl&,t0&,t15&,target%,g0&,g7&
  4522.   .|     geraet%,hard%
  4523.   .| Ruft auf  : all_targets,box_draw,form_do,box_undraw,only_used_target
  4524.   .|     clr_state,change,set_hard,hard_root
  4525.   .| Aufruf in : hard_unit-1,
  4526.   LOCAL i&,ex_obj&
  4527.   '
  4528.   all_targets
  4529.   DO
  4530.     box_draw(t.arget%)
  4531.     ex_obj&=@form_do(t.arget%) AND &HFF
  4532.     box_undraw(t.arget%)
  4533.     EXIT IF ex_obj&=tgok& OR ex_obj&=tgabb&
  4534.     only_used_target
  4535.   LOOP
  4536.   clr_state(t.arget%,ex_obj&,1)
  4537.   clr_state(t.arget%,tgwahl&,1)
  4538.   IF ex_obj&=tgok&
  4539.     change
  4540.     FOR i&=t0& TO t15&
  4541.       IF (OB_STATE(t.arget%,i&) AND 1)<>0
  4542.         target%=i&-t0&
  4543.       ENDIF
  4544.     NEXT i&
  4545.     FOR i&=g0& TO g7&
  4546.       IF (OB_STATE(t.arget%,i&) AND 1)<>0
  4547.         geraet%=i&-g0&
  4548.       ENDIF
  4549.     NEXT i&
  4550.     hard%=@set_hard(target%)
  4551.     hard_root
  4552.   ENDIF
  4553. RETURN
  4554. PROCEDURE only_used_target
  4555.   .| Glob. Var.: t.arget%,tgwahl&,t0&,tt!
  4556.   .| Ruft auf  : clr_state,clr_flags,set_state,set_flags,all_targets
  4557.   .| Aufruf in : sel_target_geraet-1,
  4558.   LOCAL i&,x&,punptr%
  4559.   '
  4560.   IF (OB_STATE(t.arget%,tgwahl&) AND 1)<>0
  4561.     FOR i&=t0& TO t0&+15
  4562.       clr_state(t.arget%,i&,1)    ! not selected
  4563.       clr_flags(t.arget%,i&,1)    ! not selectable
  4564.       set_state(t.arget%,i&,8)    ! disabled
  4565.     NEXT i&
  4566.     punptr%=LPEEK(&H516)
  4567.     FOR i&=0 TO 15+8*(tt!=0)
  4568.       x&=BYTE{punptr%+i&+2}
  4569.       IF x&<>&HFF AND punptr%>0
  4570.         clr_state(t.arget%,x&+t0&,8) ! enable
  4571.         set_flags(t.arget%,x&+t0&,1) ! selectable
  4572.       ENDIF
  4573.     NEXT i&
  4574.   ELSE
  4575.     all_targets
  4576.   ENDIF
  4577. RETURN
  4578. PROCEDURE all_targets
  4579.   .| Glob. Var.: t0&,t15&,t.arget%,tt!,g0&,g7&,target%,geraet%
  4580.   .| Ruft auf  : clr_state,set_flags,set_state
  4581.   .| Aufruf in : sel_target_geraet-1,only_used_target-1,
  4582.   LOCAL i&,a%
  4583.   '
  4584.   FOR i&=t0& TO t15&
  4585.     clr_state(t.arget%,i&,9)    ! selected+enable
  4586.     set_flags(t.arget%,i&,1)    ! selectable
  4587.   NEXT i&
  4588.   IF tt!=0
  4589.     FOR i&=t0&+8 TO t15&
  4590.       set_state(t.arget%,i&,8)  ! disable wenn kein TT
  4591.     NEXT i&
  4592.   ENDIF
  4593.   FOR i&=g0& TO g7&
  4594.     clr_state(t.arget%,i&,1)
  4595.   NEXT i&
  4596.   set_state(t.arget%,target%+t0&,1)
  4597.   set_state(t.arget%,geraet%+g0&,1)
  4598. RETURN
  4599. '
  4600. PROCEDURE unit_ready
  4601.   .| Glob. Var.: erg%,block%,buf%,hard%,h_error%,buf2%,com_blk%,bps%,last%
  4602.   .| Ruft auf  : scsicall,hard_err,out,runden$,hard_test_big,do_list
  4603.   .| Aufruf in : show_root-1,
  4604.   LOCAL a#,a%,b%,x%,a$,b$
  4605.   '
  4606.   erg%=3
  4607.   CLR block%
  4608.   scsicall(0,0,0,0,buf%,6,5)     ! UNIT READY
  4609.   hard_err
  4610.   IF hard%=3 AND h_error%=0      ! nur bei SCSI-Platten
  4611.     scsicall(18,0,64,0,buf%,6,5) ! INQUIRY
  4612.     '
  4613.     a$=STRING$(8,0)
  4614.     BMOVE buf2%+8,VARPTR(a$),8
  4615.     out("Hersteller   : "+a$)
  4616.     b$=STRING$(16,0)
  4617.     BMOVE buf2%+16,VARPTR(b$),16
  4618.     out("Produkt      : "+b$)
  4619.     out("SCSI-Version : "+STR$(BYTE{buf2%+2}))
  4620.     a$=STRING$(3,0)
  4621.     BMOVE buf2%+32,VARPTR(a$),3
  4622.     out("Firmware     : "+a$)
  4623.     IF INSTR(b$,"SQ555") OR INSTR(b$,"SQ5110") OR INSTR(b$,"SQ5200") OR INSTR(b$,"SQ3105") OR INSTR(b$,"SQ3270")  ! Wechselmedium?
  4624.       a$=STRING$(7,0)
  4625.       BMOVE buf2%+49,V:a$,7
  4626.       out("Mediumserial : "+a$)
  4627.     ENDIF
  4628.     hard_err
  4629.     out("")
  4630.     '
  4631.     {com_blk%+4}=0
  4632.     CARD{com_blk%+8}=0
  4633.     scsicall(37,0,0,0,buf%,10,5) ! Read CAPACITY
  4634.     IF h_error%=0
  4635.       out("READ CAPACITY:")
  4636.       a%={buf2%}+1
  4637.       b%={buf2%+4}
  4638.       a$=STR$(a%)+" Blöcke zu "+STR$(b%)+" Bytes"
  4639.       out(a$+" = "+@runden$(a%*b%/1.04858E+06)+" MB")
  4640.     ENDIF
  4641.     x%=@hard_test_big
  4642.     IF x%>0
  4643.       a%=x%
  4644.       b%=bps%
  4645.       out("Von SED festgestellt:")
  4646.       a$=STR$(a%)+" Blöcke zu "+STR$(b%)+" Bytes"
  4647.       out(a$+" = "+@runden$(a%*b%/1.04858E+06)+" MB")
  4648.     ENDIF
  4649.     CLR last%,block%
  4650.     scsicall(8,block%,1,0,buf%,6,4)     ! Rootsektor lesen
  4651.     hard_err
  4652.   ENDIF
  4653.   do_list
  4654. RETURN
  4655. FUNCTION hard_test_big        ! Letzten Block ausfindig machen
  4656.   .| Glob. Var.: fer%,block%,abb%,platte$,buf%,h_fehler%
  4657.   .| Felder    : err_fld$()
  4658.   .| Ruft auf  : scsicall,hard_err,was_ist
  4659.   .| Aufruf in : hard_part-1,unit_ready-1,
  4660.   LOCAL hb%,hbo%,aa%,i%
  4661.   '
  4662.   aa%=fer%
  4663.   block%=&X11111111111111111111
  4664.   hb%=block% DIV 2
  4665.   hbo%=hb%
  4666.   CLR abb%
  4667.   DO
  4668.     EXIT IF LEFT$(platte$,6)="CONNER"
  4669.     scsicall(8,block%,1,0,buf%,6,4)
  4670.     hard_err
  4671.     IF h_fehler%<>33
  4672.       ADD block%,hb%
  4673.     ELSE
  4674.       SUB block%,hb%
  4675.     ENDIF
  4676.     EXIT IF hb%=1 AND h_fehler%<>33
  4677.     abb%=@was_ist
  4678.     hb%=MAX(1,hb%/2)
  4679.     IF hb%=1 AND hbo%=1
  4680.       abb%=1
  4681.     ENDIF
  4682.     hbo%=hb%
  4683.     EXIT IF abb%<>0
  4684.   LOOP
  4685.   '
  4686.   IF LEFT$(platte$,6)="CONNER"
  4687.     abb%=1
  4688.   ENDIF
  4689.   '
  4690.   REPEAT
  4691.     EXIT IF abb%<>0
  4692.     scsicall(8,block%,1,0,buf%,6,4)
  4693.     hard_err
  4694.     INC block%
  4695.     abb%=@was_ist
  4696.   UNTIL h_fehler%=33
  4697.   '
  4698.   FOR i%=aa% TO fer%
  4699.     err_fld$(i%)=""
  4700.   NEXT i%
  4701.   fer%=aa%
  4702.   '
  4703.   IF abb%=0
  4704.     RETURN block%-1
  4705.   ELSE
  4706.     RETURN -1
  4707.   ENDIF
  4708. ENDFUNC
  4709. '
  4710. PROCEDURE root_sec(rt%)       ! ROOT-Sektor auswerten
  4711.   .| Glob. Var.: h_error%,block%,buf%,hard%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc%
  4712.   .|     hi_lz%,hi_rt%,hi_spt%,hi_size%,hi_in%,bsl_start%,bsl_count%,max_part%
  4713.   .|     part_total%,off%,first%
  4714.   .| Felder    : p_flag%(),p_start%(),p_size%(),p_block%(),p_id$()
  4715.   .| Ruft auf  : scsicall,hard_err,do_mode_sense,get_root
  4716.   .| Aufruf in : hard_zero-1,hard_format-1,hard_install-1,hard_noboot-1
  4717.   .|     hard_save-1,hard_restore-2,hard_bad-1,hdx_set_bad-1,get_root_info-1
  4718.   .|     hard_root-1,
  4719.   LOCAL x1%,i%,hi_size#
  4720.   CLR h_error%,block%
  4721.   IF rt%=1
  4722.     scsicall(8,block%,1,0,buf%,6,4)     ! Rootsektor lesen
  4723.     hard_err
  4724.   ENDIF
  4725.   IF h_error%=0
  4726.     do_mode_sense
  4727.     hard_err
  4728.     IF h_error%<>0
  4729.       IF hard%=2
  4730.         hi_cc%=CARD{buf%+&H1B6}         ! Zylinder
  4731.         hi_dhc%=BYTE{buf%+&H1B8}        ! Köpfe
  4732.         hi_rwcc%=CARD{buf%+&H1BA}       ! 1. Spur mit reduziertem Schreibstrom
  4733.         hi_wpc%=CARD{buf%+&H1BC}        !   '    '    Vorkompensation
  4734.         hi_lz%=BYTE{buf%+&H1BE}         ! Breite der Parkzone
  4735.         hi_rt%=BYTE{buf%+&H1BF}         ! Steprate
  4736.         hi_spt%=BYTE{buf%+&H1C1}        ! Sektoren pro Track
  4737.         hi_size%={buf%+&H1C2}           ! Größe der Platte
  4738.       ENDIF
  4739.     ENDIF
  4740.     IF hard%<>3
  4741.       hi_in%=BYTE{buf%+&H1C0}           ! Interleave
  4742.     ENDIF
  4743.     IF hi_size%=0
  4744.       hi_size#=ABS(hi_cc%*hi_dhc%*hi_spt%)
  4745.       hi_size%=MIN(&H7FFFFFFF,hi_size#)
  4746.     ENDIF
  4747.     bsl_start%={buf%+&H1F6}             ! Bad Sektor List
  4748.     bsl_count%={buf%+&H1FA}             ! Bad Sektor Count
  4749.     '
  4750.     ARRAYFILL p_flag%(),0
  4751.     ARRAYFILL p_start%(),0
  4752.     ARRAYFILL p_size%(),0
  4753.     ARRAYFILL p_block%(),0
  4754.     FOR i%=0 TO max_part%
  4755.       p_id$(i%)="   "           ! alles löschen
  4756.     NEXT i%
  4757.     '
  4758.     CLR part_total%,off%,block%,first%
  4759.     get_root(block%)
  4760.     '
  4761.   ENDIF
  4762. RETURN
  4763. PROCEDURE get_root(block%)    ! nach Einträgen suchen
  4764.   .| Glob. Var.: cbhd_found%,buf%
  4765.   .| Ruft auf  : hard_read_sec,viererblock
  4766.   .| Aufruf in : root_sec-1,viererblock-1,
  4767.   CLR cbhd_found%
  4768.   hard_read_sec(block%)
  4769.   ~@viererblock(buf%+&H1C6,0)
  4770.   IF @viererblock(buf%+&H156,4)>0
  4771.     cbhd_found%=1
  4772.   ENDIF
  4773.   IF @viererblock(buf%+&H186,8)>0
  4774.     cbhd_found%=1
  4775.   ENDIF
  4776. RETURN
  4777. FUNCTION viererblock(pnt%,pnr%)
  4778.   .| Glob. Var.: hi_size%,part_total%,first%,off%,block%
  4779.   .| Felder    : p_flag%(),p_id$(),p_start%(),p_size%(),p_block%()
  4780.   .| Ruft auf  : get_root,hard_read_sec
  4781.   .| Aufruf in : get_root-3,
  4782.   LOCAL b%,c%,i%,j%,kennbyte%,p%,ff%
  4783.   '
  4784.   CLR ff%
  4785.   FOR i%=0 TO 3
  4786.     p%=pnt%+i%*12
  4787.     CLR b%
  4788.     FOR j%=1 TO 3
  4789.       c%=BYTE{p%+j%}
  4790.       IF (c%>=ASC("a") AND c%<=ASC("z")) OR (c%>=ASC("A") AND c%<=ASC("Z")) OR (c%>=ASC("0") AND c%<=ASC("9"))
  4791.         INC b%
  4792.       ENDIF
  4793.     NEXT j%
  4794.     IF b%>0
  4795.       b%={p%+4}
  4796.       IF b%>0 AND b%<hi_size%
  4797.         b%={p%+8}
  4798.         IF b%>0 AND b%<hi_size%
  4799.           INC part_total%
  4800.           j%=part_total%
  4801.           ff%=1
  4802.           p_flag%(j%)=BYTE{p%}
  4803.           p_id$(j%)=CHR$(BYTE{p%+1})+CHR$(BYTE{p%+2})+CHR$(BYTE{p%+3})
  4804.           '
  4805.           IF p_id$(j%)="XGM"
  4806.             IF first%=0
  4807.               off%={p%+4}  ! Start-Block der ersten XGM
  4808.               first%=1
  4809.               p_start%(j%)={p%+4}+block%
  4810.             ELSE
  4811.               p_start%(j%)={p%+4}+off%
  4812.             ENDIF
  4813.           ELSE
  4814.             p_start%(j%)={p%+4}+block%
  4815.           ENDIF
  4816.           p_size%(j%)=b%
  4817.           p_block%(j%)=block%
  4818.           '
  4819.           IF p_id$(j%)="XGM"
  4820.             DEC part_total%     !!!
  4821.             get_root(p_start%(j%))
  4822.             hard_read_sec(block%)
  4823.           ENDIF
  4824.         ENDIF
  4825.       ENDIF
  4826.     ENDIF
  4827.   NEXT i%
  4828.   RETURN ff%
  4829. ENDFUNC
  4830. '
  4831. PROCEDURE hard_root           ! ROOT-Sektor auswerten
  4832.   .| Glob. Var.: erg%,h_error%,target%,geraet%,hi_cc%,hi_dhc%,hi_lz%,hi_rt%
  4833.   .|     hi_in%,hi_bps%,hi_spt%,hi_size%,bsl_start%,bsl_count%,cbhd_found%
  4834.   .|     h_fehler%
  4835.   .| Ruft auf  : root_sec,do_clr_out,out,runden$,chk_sum,show_root
  4836.   .|     hard_message,do_list
  4837.   .| Aufruf in : hard_part-1,hard_install-1,last_11-1,sel_target_geraet-1
  4838.   .|     menu_mess-1,
  4839.   erg%=3
  4840.   root_sec(1)
  4841.   IF h_error%=0
  4842.     do_clr_out("Rootsektor von Target "+STR$(target%)+", Gerät "+STR$(geraet%))
  4843.     out("Anzahl der Zylinder   : "+STR$(hi_cc%))
  4844.     out("Anzahl der Köpfe      : "+STR$(hi_dhc%))
  4845.     out("Breite der Parkzone   : "+STR$(hi_lz%))
  4846.     out("Steprate              : "+STR$(hi_rt%))
  4847.     out("Interleave            : "+STR$(hi_in%))
  4848.     out("Blockgröße            : "+STR$(hi_bps%))
  4849.     out("Blöcke pro Spur       : "+STR$(hi_spt%))
  4850.     out("Anzahl Blöcke gesamt  : "+STR$(hi_size%)+" = "+@runden$(hi_size%/2048)+" MByte")
  4851.     out("Bad Sector List ab    : $"+HEX$(bsl_start%,6))
  4852.     out("Länge der BSL         : $"+HEX$(bsl_count%,6))
  4853.     out("Prüfsumme             : $"+HEX$(@chk_sum,4))
  4854.     IF cbhd_found%>0
  4855.       out("CBHD-Format")
  4856.     ELSE
  4857.       out("")
  4858.     ENDIF
  4859.     out("")
  4860.     out("    ID    Start    Größe    MB    Block   Flags")
  4861.     show_root
  4862.   ELSE
  4863.     hard_message(h_fehler%)
  4864.     do_list
  4865.   ENDIF
  4866. RETURN
  4867. PROCEDURE show_root           ! ROOT-INFO anzeigen
  4868.   .| Glob. Var.: part_total%,wc%,n$,bps%,part_anz%,erg%
  4869.   .| Felder    : p_id$(),p_start%(),p_size%(),p_block%(),p_flag%()
  4870.   .| Ruft auf  : out,dec_hex_val$,runden$,unit_ready,out_do,set_last
  4871.   .| Aufruf in : hard_root-1,
  4872.   LOCAL a$,b$,i%,j%
  4873.   '
  4874.   out(STRING$(50,"-"))
  4875.   FOR i%=1 TO part_total%
  4876.     a$=SPACE$(wc%)
  4877.     IF p_id$(i%)="GEM" OR p_id$(i%)="BGM"
  4878.       INC j%
  4879.       MID$(a$,1)=RIGHT$(n$+STR$(j%),2)
  4880.     ENDIF
  4881.     MID$(a$,5)=p_id$(i%)+"  "+@dec_hex_val$(p_start%(i%),7)
  4882.     MID$(a$,19)=@dec_hex_val$(p_size%(i%),7)
  4883.     MID$(a$,28)=@runden$(p_size%(i%)*bps%/1.04858E+06)
  4884.     MID$(a$,34)=@dec_hex_val$(p_block%(i%),7)
  4885.     MID$(a$,43)=@dec_hex_val$(p_flag%(i%),3)
  4886.     IF (p_flag%(i%) AND 1)<>0
  4887.       b$="Exist"
  4888.     ENDIF
  4889.     IF (p_flag%(i%) AND &H80)<>0
  4890.       b$=b$+"  Boot"
  4891.     ENDIF
  4892.     MID$(a$,48)=b$
  4893.     out(a$)
  4894.   NEXT i%
  4895.   '
  4896.   out("")
  4897.   part_anz%=j%
  4898.   unit_ready
  4899.   erg%=3
  4900.   out_do
  4901.   set_last(7)
  4902. RETURN
  4903. PROCEDURE last_7              ! Rootinfo
  4904.   .| Glob. Var.: top%,txt_zeile%,part_anz%,block%
  4905.   .| Felder    : p_start%(),whdl&()
  4906.   .| Ruft auf  : lesen,wind_top,do_list
  4907.   .| Aufruf in : maus_pos-1,
  4908.   LOCAL a%
  4909.   a%=top%+txt_zeile%
  4910.   IF a%>14 AND a%<15+part_anz%
  4911.     block%=p_start%(a%-14)
  4912.     lesen
  4913.     wind_top(whdl&(0))
  4914.     do_list
  4915.   ENDIF
  4916. RETURN
  4917. '
  4918. PROCEDURE nix_vortex
  4919.   .| Ruft auf  : alrt
  4920.   .| Aufruf in : show_hard_data-1,hard_mode_select-1,
  4921.   ~@alrt(1,"... geht nicht bei|'VORTEX'! ",1,"Warum?")
  4922.   ~@alrt(1,"Weiß nicht warum -|Vortex fragen!",1,"Darum")
  4923. RETURN
  4924. '
  4925. PROCEDURE hard_copy           ! physikalische Kopie erstellen
  4926.   .| Glob. Var.: a$,wa$,el%,buf_size%
  4927.   .| Ruft auf  : alrt,no_protekt,eingabe,mdisk,hard_do_copy,was_ist
  4928.   .| Aufruf in : menu_mess-1,
  4929.   LOCAL qtarg%,ztarg%,qanz%,qblock%,zblock%,qend%,i%,bl_anz%
  4930.   '
  4931.   a$="target"
  4932.   IF @alrt(1,"Vorsicht:|--------------------------|Mit dieser Funktion sollte|man nicht spielen!!!",2,wa$)=1
  4933.     IF @no_protekt=1
  4934.       qtarg%=@eingabe("Quell"+a$,0)
  4935.       IF el%>0
  4936.         ztarg%=@eingabe("Ziel"+a$,0)
  4937.         IF el%>0
  4938.           qblock%=@eingabe("1. Blocknummer auf Quell"+a$,0)
  4939.           IF el%>0
  4940.             qanz%=@eingabe("Anzahl der Blöcke",0)
  4941.             IF el%>0
  4942.               zblock%=@eingabe("Blocknummer auf Ziel"+a$,0)
  4943.               IF el%>0
  4944.                 '
  4945.                 bl_anz%=buf_size%/512
  4946.                 qend%=qblock%+qanz%
  4947.                 '
  4948.                 WHILE qblock%<qend%
  4949.                   '
  4950.                   mdisk
  4951.                   IF @hard_do_copy(qtarg%,ztarg%,qblock%,zblock%,bl_anz%)<>0
  4952.                     '
  4953.                     FOR i%=0 TO bl_anz%-1
  4954.                       ~@hard_do_copy(qtarg%,ztarg%,qblock%+i%,zblock%+i%,1)
  4955.                     NEXT i%
  4956.                   ENDIF
  4957.                   '
  4958.                   ADD qblock%,bl_anz%
  4959.                   ADD zblock%,bl_anz%
  4960.                   '
  4961.                   EXIT IF @was_ist<>0
  4962.                   '
  4963.                 WEND
  4964.               ENDIF
  4965.             ENDIF
  4966.           ENDIF
  4967.         ENDIF
  4968.       ENDIF
  4969.     ENDIF
  4970.   ENDIF
  4971. RETURN
  4972. FUNCTION hard_do_copy(qtarg%,ztarg%,qblock%,zblock%,bl_anz%)
  4973.   .| Glob. Var.: target%,hard%,buf%,block%,h_error%
  4974.   .| Felder    : whdl&()
  4975.   .| Ruft auf  : set_hard,scsicall,hard_err,set_slide
  4976.   .| Aufruf in : hard_copy-2,
  4977.   target%=qtarg%
  4978.   hard%=@set_hard(target%)
  4979.   scsicall(8,qblock%,bl_anz%,0,buf%,6,4)         ! Lesen
  4980.   hard_err
  4981.   block%=qblock%
  4982.   set_slide(whdl&(0))
  4983.   IF h_error%=0
  4984.     target%=ztarg%
  4985.     hard%=@set_hard(target%)
  4986.     scsicall(10,zblock%,bl_anz%,0,buf%,6,2)     ! Schreiben
  4987.     hard_err
  4988.   ENDIF
  4989.   RETURN h_error%
  4990. ENDFUNC
  4991. '
  4992. ' ---------------------- AB HIER FLOPPY-ROUTINEN ----------------
  4993. PROCEDURE floppy(op%,track%,sector%,laenge%,fbuf1%,fbuf2%,fax%,parm%,temp%)
  4994.   .| Glob. Var.: flo_com%,locksley%,trk_len%,l_end%,byt%,fdc_stat%,fdc_stat2%
  4995.   .| Aufruf in : select-1,deselect-1,rst-1,irq-1,do_seek-1,read_trk-1
  4996.   .|     write_trk-1,read_sector-1,write_sec-1,read_adr_feld-1,fdc_speed-2
  4997.   .|     fdc_secread-1,fdc_secwrite-1,do_trk_write-1,fdc_protect-1,analyse-2,
  4998.   CARD{flo_com%}=op%            ! CODE
  4999.   CARD{flo_com%+2}=track%       ! Tracknummer
  5000.   CARD{flo_com%+4}=sector%      ! Länge der Übertragung
  5001.   CARD{flo_com%+6}=laenge%      ! Länge der Übertragung
  5002.   {flo_com%+8}=fbuf1%           ! Puffer 1
  5003.   {flo_com%+12}=fbuf2%          ! Puffer 2
  5004.   CARD{flo_com%+32}=fax%        ! Laufwerk+Seite / Extendet-Mode (Register...)
  5005.   CARD{flo_com%+34}=parm%       ! Extended Parameter
  5006.   CARD{flo_com%+36}=temp%       !     "
  5007.   ~C:locksley%(L:flo_com%)
  5008.   IF op%=224                    ! $E0
  5009.     trk_len%={flo_com%+24}-{flo_com%+20}
  5010.     l_end%=MAX(512,trk_len%)
  5011.   ELSE
  5012.     byt%={flo_com%+24}-{flo_com%+20}
  5013.   ENDIF
  5014.   fdc_stat%=CARD{flo_com%+36}
  5015.   fdc_stat2%=CARD{flo_com%+34}
  5016. RETURN
  5017. PROCEDURE select
  5018.   .| Glob. Var.: track%,buf%,fdc1%,seite%,fdrive%
  5019.   .| Ruft auf  : floppy
  5020.   .| Aufruf in : fdc_drive-1,
  5021.   floppy(&HD0,track%,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0)
  5022. RETURN
  5023. PROCEDURE deselect
  5024.   .| Glob. Var.: track%,buf%,fdc1%
  5025.   .| Ruft auf  : floppy
  5026.   .| Aufruf in : chk_fdc-1,
  5027.   floppy(&HD0,track%,0,0,buf%,fdc1%,0,0,0)
  5028. RETURN
  5029. PROCEDURE rst
  5030.   .| Glob. Var.: track%,fdrive%,buf%,fdc1%,seite%
  5031.   .| Felder    : rate%(),whdl&()
  5032.   .| Ruft auf  : floppy,set_slide,gap
  5033.   .| Aufruf in : fdc_trkread-1,
  5034.   CLR track%
  5035.   floppy(0+rate%(fdrive%+5),track%,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0)
  5036.   set_slide(whdl&(0))
  5037.   gap
  5038. RETURN
  5039. PROCEDURE irq
  5040.   .| Glob. Var.: buf%,fdc1%,seite%,fdrive%
  5041.   .| Ruft auf  : floppy
  5042.   .| Aufruf in : fdc_speed-1,fdc_protect-1,
  5043.   floppy(208,0,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0)
  5044. RETURN
  5045. PROCEDURE do_seek(track%)
  5046.   .| Glob. Var.: fdrive%,buf%,fdc1%,seite%
  5047.   .| Felder    : rate%()
  5048.   .| Ruft auf  : floppy
  5049.   .| Aufruf in : step_in-1,step_out-1,fdc_trkread-1,fdc_trkwrite-1,lesen-1,
  5050.   floppy(16+rate%(fdrive%+5),track%,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0)
  5051. RETURN
  5052. PROCEDURE step_in
  5053.   .| Glob. Var.: track%
  5054.   .| Ruft auf  : do_seek
  5055.   .| Aufruf in : fdc_diskanal-1,fdc_head-1,fdc_null-1,
  5056.   INC track%
  5057.   do_seek(track%)
  5058. RETURN
  5059. PROCEDURE step_out
  5060.   .| Glob. Var.: track%
  5061.   .| Ruft auf  : do_seek
  5062.   .| Aufruf in : fdc_head-1,
  5063.   track%=MAX(0,track%-1)
  5064.   do_seek(track%)
  5065. RETURN
  5066. PROCEDURE read_trk(laenge%)
  5067.   .| Glob. Var.: track%,buf%,fdc1%,seite%,fdrive%
  5068.   .| Ruft auf  : floppy
  5069.   .| Aufruf in : gap-1,fdc_anal-1,fdc_diskanal-1,
  5070.   IF laenge%>0
  5071.     floppy(192+32,track%,0,laenge%,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0)
  5072.   ENDIF
  5073. RETURN
  5074. PROCEDURE write_trk(laenge%)
  5075.   .| Glob. Var.: track%,buf%,fdc1%,seite%,fdrive%
  5076.   .| Ruft auf  : floppy
  5077.   .| Aufruf in : do_trk_write-1,fdc_null-2,
  5078.   IF laenge%>0
  5079.     floppy(15*16,track%,0,laenge%+32,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0)
  5080.   ENDIF
  5081. RETURN
  5082. PROCEDURE read_sector(sector%,laenge%)
  5083.   .| Glob. Var.: multiple%,track%,fdc3%,seite%,fdrive%
  5084.   .| Ruft auf  : floppy
  5085.   .| Aufruf in : fdc_secread-1,analyse-1,
  5086.   IF laenge%>0
  5087.     floppy(128+multiple%,track%,sector%,laenge%,fdc3%,fdc3%,seite%+(fdrive%+1)*2,0,0)
  5088.   ENDIF
  5089. RETURN
  5090. PROCEDURE write_sec(laenge%,sector%)
  5091.   .| Glob. Var.: sec_hd%,multiple%,track%,buf%,fdc3%,seite%,fdrive%
  5092.   .| Ruft auf  : floppy
  5093.   .| Aufruf in : fdc_secwrite-1,do_trk_write-1,
  5094.   LOCAL a%
  5095.   IF laenge%>0
  5096.     a%=&HA0-(sec_hd%=&HF8)-(sec_hd%=&HF9) ! Befehlscode berechnen
  5097.     floppy(a%+multiple%,track%,sector%,laenge%,buf%,fdc3%,seite%+(fdrive%+1)*2,0,0)
  5098.   ENDIF
  5099. RETURN
  5100. PROCEDURE read_adr_feld(laenge%)
  5101.   .| Glob. Var.: track%,fdc1%,fdc2%,seite%,fdrive%
  5102.   .| Ruft auf  : floppy
  5103.   .| Aufruf in : fdc_readadress-1,gap-1,fdc_anal-1,fdc_diskanal-1,
  5104.   IF laenge%>0
  5105.     floppy(192,track%,0,laenge%*4,fdc1%,fdc2%,seite%+(fdrive%+1)*2,0,0)
  5106.   ENDIF
  5107. RETURN
  5108. ' Statuszeile
  5109. PROCEDURE fdc_side
  5110.   .| Glob. Var.: seite%
  5111.   .| Ruft auf  : change,lesen,do_list
  5112.   .| Aufruf in : stat_line-1,
  5113.   change
  5114.   seite%=1-seite%
  5115.   lesen
  5116.   do_list
  5117. RETURN
  5118. PROCEDURE fdc_bytes
  5119.   .| Ruft auf  : alrt
  5120.   .| Aufruf in : stat_line-1,
  5121.   ~@alrt(1,"Anzahl der gelesenen Bytes!",1," Aha ")
  5122. RETURN
  5123. PROCEDURE fdc_drive
  5124.   .| Glob. Var.: nflops%,fdrive%
  5125.   .| Ruft auf  : change,alrt,select,lesen
  5126.   .| Aufruf in : stat_line-1,
  5127.   change
  5128.   nflops%=DPEEK(&H4A6)          ! Anzahl der Laufwerke
  5129.   IF nflops%=1
  5130.     ~@alrt(3,"Kein Laufwerk B: dran! ",1,"Abbruch")
  5131.   ELSE
  5132.     fdrive%=1-fdrive%
  5133.   ENDIF
  5134.   select
  5135.   lesen
  5136. RETURN
  5137. '
  5138. PROCEDURE fdc_speed
  5139.   .| Glob. Var.: b.ox%,boxtxt&,fdrive%,boxaktiv&,mfp%,track%,sector%,laenge%
  5140.   .|     buf%,fdc3%
  5141.   .| Ruft auf  : put_char,box_draw,mdisk,floppy,mousek,objc_update,mnorm
  5142.   .|     box_undraw,irq
  5143.   .| Aufruf in : menu_mess-1,
  5144.   LOCAL dr#,genau%,t%,t2#,t3#,a$
  5145.   put_char(b.ox%,boxtxt&,"Drehzahl von Laufwerk "+CHR$(fdrive%+65))
  5146.   put_char(b.ox%,boxaktiv&," ")
  5147.   box_draw(b.ox%)
  5148.   mfp%=&HFFFFFA01
  5149.   genau%=25
  5150.   mdisk
  5151.   REPEAT
  5152.     floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H80,&HD4)
  5153.     CLR t%
  5154.     REPEAT                              ! Warte bis Index
  5155.     UNTIL (PEEK(mfp%) AND 32)=0         ! Dann Start !!
  5156.     t2#=TIMER                            ! Stopuhr
  5157.     WHILE t%<genau%
  5158.       floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H80,&HD4)
  5159.       REPEAT
  5160.       UNTIL (PEEK(mfp%) AND 32)=0       ! Warte auf Index
  5161.       EXIT IF @mousek=2
  5162.       INC t%
  5163.     WEND
  5164.     t3#=TIMER
  5165.     dr#=12000*genau%/(t3#-t2#)             ! Zeit berechnen
  5166.     dr#=INT(dr#*100)/100
  5167.     a$=STR$(dr#)
  5168.     IF INSTR(a$,".")>0
  5169.       IF MID$(a$,4,1)<>"."
  5170.         a$=LEFT$(LEFT$(a$,3)+".00",6)
  5171.       ENDIF
  5172.     ELSE
  5173.       a$=a$+".00"
  5174.     ENDIF
  5175.     put_char(b.ox%,boxaktiv&,a$)
  5176.     objc_update(b.ox%,boxaktiv&)
  5177.   UNTIL @mousek=2
  5178.   mnorm
  5179.   box_undraw(b.ox%)
  5180.   irq
  5181.   WHILE @mousek
  5182.   WEND
  5183. RETURN
  5184. PROCEDURE fdc_steprate
  5185.   .| Glob. Var.: ratea%,rateb%,stepa2&,step.rate%,stepb2&,stephd&,ex_obj&
  5186.   .|     stepresi&
  5187.   .| Felder    : rate%()
  5188.   .| Ruft auf  : floprate,set_state,clr_state,hdumschaltung,box_draw,form_do
  5189.   .|     box_undraw
  5190.   .| Aufruf in : menu_mess-1,
  5191.   LOCAL a%,i&,j&
  5192.   '
  5193.   a%=@floprate(-1,-1)
  5194.   ratea%=(a% AND &HFF)
  5195.   rateb%=(a% AND &HFF0000)/&H10000
  5196.   '
  5197.   FOR i&=1 TO 4
  5198.     j&=stepa2&+i&-1
  5199.     IF ratea%=rate%(i&)
  5200.       set_state(step.rate%,j&,1)
  5201.     ELSE
  5202.       clr_state(step.rate%,j&,1)
  5203.     ENDIF
  5204.   NEXT i&
  5205.   FOR i&=1 TO 4
  5206.     j&=stepb2&+i&-1
  5207.     IF rateb%=rate%(i&)
  5208.       set_state(step.rate%,j&,1)
  5209.     ELSE
  5210.       clr_state(step.rate%,j&,1)
  5211.     ENDIF
  5212.   NEXT i&
  5213.   a%=@hdumschaltung(-1)
  5214.   IF a%>0
  5215.     set_state(step.rate%,stephd&,1)
  5216.   ELSE
  5217.     clr_state(step.rate%,stephd&,1)
  5218.   ENDIF
  5219.   '
  5220.   box_draw(step.rate%)
  5221.   ex_obj&=@form_do(step.rate%) AND &HFF
  5222.   box_undraw(step.rate%)
  5223.   '
  5224.   FOR i&=stepa2& TO stepa2&+3
  5225.     IF (OB_STATE(step.rate%,i&) AND 1)<>0
  5226.       rate%(5)=rate%(i&-stepa2&+1)
  5227.       ratea%=i&-stepa2&+1
  5228.     ENDIF
  5229.   NEXT i&
  5230.   FOR i&=stepb2& TO stepb2&+3
  5231.     IF (OB_STATE(step.rate%,i&) AND 1)<>0
  5232.       rate%(6)=rate%(i&-stepb2&+1)
  5233.       rateb%=i&-stepb2&+1
  5234.     ENDIF
  5235.   NEXT i&
  5236.   IF (OB_STATE(step.rate%,stepresi&) AND 1)<>0
  5237.     a%=@floprate(rate%(ratea%),rate%(rateb%))   ! resident halten
  5238.   ENDIF
  5239.   IF (OB_STATE(step.rate%,stephd&) AND 1)<>0
  5240.     a%=@hdumschaltung(3)
  5241.   ELSE
  5242.     a%=@hdumschaltung(0)
  5243.   ENDIF
  5244.   clr_state(step.rate%,ex_obj&,1)
  5245. RETURN
  5246. PROCEDURE fdc_readadress
  5247.   .| Glob. Var.: erg%,fdc1%,b$,a$,fdc2%,trk_len%
  5248.   .| Ruft auf  : clr_out,gap,read_adr_feld,dec_hex_val$,out,out_do
  5249.   .| Aufruf in : menu_mess-1,
  5250.   LOCAL a%,b%,i%,j%,j1%,k%,total%
  5251.   '
  5252.   erg%=3
  5253.   clr_out("Spur   Seite  Sektor Länge  CRC    Status  Position")
  5254.   gap
  5255.   IF total%>0
  5256.     read_adr_feld(100)     ! max. 100 Sektoren??
  5257.     '
  5258.     CLR i%
  5259.     j1%=fdc1%
  5260.     k%=3
  5261.     b$="     "
  5262.     REPEAT
  5263.       CLR a$
  5264.       FOR j%=0 TO 3
  5265.         a$=a$+HEX$(BYTE{j1%},2)+b$        ! in FDC1: Header
  5266.         INC j1%
  5267.       NEXT j%
  5268.       a$=a$+HEX$(BYTE{j1%},2)
  5269.       a$=a$+HEX$(BYTE{j1%+1},2)+b$
  5270.       ADD j1%,2
  5271.       a%=BYTE{fdc2%+k%}
  5272.       a$=a$+HEX$(a%,2)
  5273.       EXIT IF a%=0
  5274.       a%=CARD{fdc2%+k%+1}
  5275.       b%=trk_len%*(a%/total%)-8
  5276.       a$=a$+b$+@dec_hex_val$(b%,5)
  5277.       out(a$)
  5278.       ADD k%,4
  5279.       ADD i%,8
  5280.     UNTIL i%>=63*8
  5281.   ENDIF
  5282.   out_do
  5283. RETURN
  5284. '
  5285. PROCEDURE fdc_trkread
  5286.   .| Glob. Var.: track%,el%
  5287.   .| Ruft auf  : change,eingabe,rst,do_seek,lesen,do_list
  5288.   .| Aufruf in : menu_mess-1,stat_line-1,
  5289.   change
  5290.   track%=@eingabe("Zieltrack eingeben",track%)
  5291.   IF el%>0
  5292.     IF track%=0
  5293.       rst
  5294.     ELSE
  5295.       do_seek(track%)
  5296.     ENDIF
  5297.     lesen
  5298.     do_list
  5299.   ENDIF
  5300. RETURN
  5301. PROCEDURE fdc_trkwrite
  5302.   .| Glob. Var.: track%,el%
  5303.   .| Ruft auf  : eingabe,do_seek,do_trk_write,lesen
  5304.   .| Aufruf in : menu_mess-1,
  5305.   track%=@eingabe("Track schreiben auf Track:",track%)
  5306.   IF el%>0
  5307.     do_seek(track%)
  5308.     do_trk_write
  5309.     lesen
  5310.   ENDIF
  5311. RETURN
  5312. PROCEDURE fdc_trackconfig
  5313.   .| Glob. Var.: c.track%,ex_obj&,trkok&,trkd10&,trkd8&,trkd5&,sc%
  5314.   .|     trk_len_max%,buf%,trkd1&,trkd7&,trkd11&,trkd3&,trkd4&,trkd6&,trkd2&
  5315.   .|     trk_len%,l_end%
  5316.   .| Felder    : l_end%(),whdl&()
  5317.   .| Ruft auf  : box_draw,form_do,clr_state,box_undraw,get_val,clear_buf,fuell
  5318.   .|     set_slide,do_list
  5319.   .| Aufruf in : menu_mess-1,
  5320.   LOCAL a%,sec_len%,secnr%,sec_tr%,durch%,interleave%,zg%,a$
  5321.   '
  5322.   box_draw(c.track%)
  5323.   ex_obj&=@form_do(c.track%) AND &HFF
  5324.   clr_state(c.track%,ex_obj&,1)
  5325.   box_undraw(c.track%)
  5326.   '
  5327.   IF ex_obj&=trkok&
  5328.     '
  5329.     sec_tr%=@get_val(c.track%,trkd10&)
  5330.     interleave%=@get_val(c.track%,trkd8&)
  5331.     ' @get_val(c.track%,trkd9&) ! 1.Sektor?
  5332.     durch%=1
  5333.     '
  5334.     sec_len%=@get_val(c.track%,trkd5&)
  5335.     SELECT sec_len%
  5336.     CASE 128
  5337.       sc%=0
  5338.     CASE 256
  5339.       sc%=1
  5340.     CASE 512
  5341.       sc%=2
  5342.     CASE 1024
  5343.       sc%=3
  5344.     DEFAULT
  5345.       sc%=sec_len%
  5346.     ENDSELECT
  5347.     '
  5348.     clear_buf(1)        ! Puffer löschen
  5349.     fuell(0,2,trk_len_max%+1)
  5350.     zg%=buf%
  5351.     a$=STRING$(@get_val(c.track%,trkd1&),&H4E)  ! GAP Trackbeginn - 1. Header
  5352.     BMOVE V:a$,zg%,LEN(a$)
  5353.     ADD zg%,LEN(a$)
  5354.     '
  5355.     DO
  5356.       secnr%=durch%
  5357.       DO
  5358.         BYTE{zg%}=&HF5                          ! Header schreiben:  Sync
  5359.         BYTE{zg%+1}=&HF5
  5360.         BYTE{zg%+2}=&HF5
  5361.         BYTE{zg%+3}=&HFE
  5362.         BYTE{zg%+4}=@get_val(c.track%,trkd7&)   ! Tracknummer
  5363.         BYTE{zg%+5}=@get_val(c.track%,trkd11&)  ! Seite
  5364.         BYTE{zg%+6}=secnr%                      ! Sektornummer
  5365.         BYTE{zg%+7}=sc%                         ! Sektorgröße
  5366.         BYTE{zg%+8}=&HF7                        ! Prüfsumme
  5367.         fuell(zg%-buf%+5,1,zg%-buf%+9)
  5368.         ADD zg%,9
  5369.         '
  5370.         a$=STRING$(@get_val(c.track%,trkd3&),&H4E) ! Header - Sektor &H4E
  5371.         BMOVE V:a$,zg%,LEN(a$)
  5372.         ADD zg%,LEN(a$)
  5373.         a$=STRING$(@get_val(c.track%,trkd4&),&H0)  ! GAP/2  Header - Sektor &H00
  5374.         BMOVE V:a$,zg%,LEN(a$)
  5375.         ADD zg%,LEN(a$)
  5376.         '
  5377.         BYTE{zg%}=&HF5
  5378.         BYTE{zg%+1}=&HF5
  5379.         BYTE{zg%+2}=&HF5
  5380.         BYTE{zg%+3}=&HFB
  5381.         ADD zg%,4
  5382.         '
  5383.         fuell(zg%-buf%+1,0,zg%-buf%+sec_len%+1)
  5384.         a$=STRING$(sec_len%,&HCB)       ! Sektorinhalt
  5385.         BMOVE V:a$,zg%,LEN(a$)
  5386.         ADD zg%,LEN(a$)
  5387.         BYTE{zg%}=&HF7
  5388.         INC zg%
  5389.         '
  5390.         a$=STRING$(@get_val(c.track%,trkd6&),&H4E)      ! GAP Sektor - Header 4E
  5391.         BMOVE V:a$,zg%,LEN(a$)
  5392.         ADD zg%,LEN(a$)
  5393.         '
  5394.         ADD secnr%,interleave%
  5395.         EXIT IF secnr%>sec_tr%
  5396.         '
  5397.         a$=STRING$(@get_val(c.track%,trkd2&),&H0)      ! GAP Sektor - Header 00
  5398.         BMOVE V:a$,zg%,LEN(a$)
  5399.         '
  5400.         ADD zg%,LEN(a$)
  5401.       LOOP
  5402.       INC durch%
  5403.       EXIT IF durch%>interleave%
  5404.     LOOP
  5405.     '
  5406.     trk_len%=zg%+16-buf%
  5407.     l_end%=trk_len%
  5408.     l_end%(0)=l_end%
  5409.     '
  5410.     a%=trk_len_max%-(zg%-buf%)
  5411.     a$=STRING$(a%,&H4E)         ! nach letztem Sektor
  5412.     BMOVE V:a$,zg%,LEN(a$)
  5413.     CLR a$
  5414.     '
  5415.     set_slide(whdl&(0))
  5416.     do_list
  5417.   ENDIF
  5418.   '
  5419. RETURN
  5420. '
  5421. PROCEDURE fdc_secread
  5422.   .| Glob. Var.: sector%,el%,multiple%,track%,buf%,fdc3%,a%,byt%,trk_len_max%
  5423.   .| Ruft auf  : eingabe,clear_buf,read_sector,floppy,info_line,fuell
  5424.   .| Aufruf in : menu_mess-1,stat_line-1,
  5425.   LOCAL l1%
  5426.   '
  5427.   sector%=@eingabe("Welchen Sektor lesen",0)
  5428.   IF el%>0
  5429.     l1%=@eingabe("Wieviel Bytes lesen",514)
  5430.     IF l1%>0
  5431.       clear_buf(1)
  5432.       multiple%=16                      ! Flag für mehrere Sektoren setzen
  5433.       read_sector(sector%,l1%)
  5434.       CLR multiple%
  5435.       floppy(0,track%,0,0,buf%,fdc3%,9,128+2,track%)
  5436.       info_line
  5437.       a%=INT(byt%/128)*128
  5438.       IF byt%>0
  5439.         BMOVE fdc3%,buf%,a%
  5440.       ENDIF
  5441.       fuell(a%+1,2,trk_len_max%)
  5442.     ENDIF
  5443.   ENDIF
  5444. RETURN
  5445. PROCEDURE fdc_secwrite
  5446.   .| Glob. Var.: sector%,el%,buf%,fdc3%,sec_hd%,multiple%,track%,laenge%
  5447.   .| Ruft auf  : eingabe,write_sec,floppy
  5448.   .| Aufruf in : menu_mess-1,
  5449.   LOCAL l1%
  5450.   '
  5451.   sector%=@eingabe("Welchen Sektor schreiben",0)
  5452.   IF el%>0
  5453.     l1%=@eingabe("Wieviel Bytes schreiben",529)
  5454.     IF el%>0 AND l1%>0
  5455.       BMOVE buf%,fdc3%,l1%+10
  5456.       sec_hd%=&HFB
  5457.       multiple%=16
  5458.       write_sec(l1%,sector%)
  5459.       CLR multiple%
  5460.     ENDIF
  5461.     floppy(0,track%,0,laenge%,buf%,fdc3%,9,128+2,track%)
  5462.   ENDIF
  5463. RETURN
  5464. PROCEDURE convert
  5465.   .| Glob. Var.: wa$,an$,trk_len_max%,trk_len%,buf%,ak%,tr$
  5466.   .| Ruft auf  : alrt,anal_buf,read_old_track,do_list
  5467.   .| Aufruf in : menu_mess-1,
  5468.   IF @alrt(2,"    Achtung!   |    Sektordaten gehen verloren  ",1,wa$)=1
  5469.     an$=STRING$(trk_len_max%,0)
  5470.     IF trk_len%>0
  5471.       BMOVE buf%,VARPTR(an$),LEN(an$)           ! Track in String holen
  5472.       anal_buf                                  ! Puffer nochmal analysieren
  5473.       read_old_track                            ! Wandeln ...
  5474.       an$=STRING$(trk_len_max%,0)               ! String mit lauter Nullen
  5475.       BMOVE VARPTR(an$),ak%,LEN(an$)            ! Status löschen
  5476.       BMOVE VARPTR(tr$),buf%,LEN(tr$)           ! Zurück in Puffer
  5477.       do_list
  5478.     ENDIF
  5479.     CLR tr$,an$
  5480.   ENDIF
  5481. RETURN
  5482. PROCEDURE do_trk_write
  5483.   .| Glob. Var.: trk_len%,an$,trk_len_max%,buf%,tr$,i%,sec_anz%,sec_len%,fdc3%
  5484.   .|     sec_hd%,snr%,trk%,track%
  5485.   .| Felder    : sek%()
  5486.   .| Ruft auf  : anal_buf,read_old_track,write_trk,floppy,write_sec
  5487.   .| Aufruf in : fdc_trkwrite-1,schreiben-1,
  5488.   IF trk_len%>0
  5489.     an$=STRING$(trk_len_max%,0)
  5490.     BMOVE buf%,VARPTR(an$),LEN(an$)   ! Daten retten
  5491.     anal_buf
  5492.     read_old_track                    ! Track wandeln
  5493.     BMOVE VARPTR(tr$),buf%,LEN(tr$)   ! leerer Track im Puffer
  5494.     write_trk(LEN(tr$))               ! und jetzt schreiben.
  5495.     BMOVE VARPTR(an$),buf%,LEN(an$)   ! Daten zurückholen
  5496.     CLR an$,tr$
  5497.     FOR i%=1 TO sec_anz%              ! nun die einzelnen Sektoren schreiben
  5498.       sec_len%=sek%(i%,9)
  5499.       IF sec_len%>0                   ! Länge des Sektors
  5500.         BMOVE sek%(i%,4)+buf%-1,fdc3%,sec_len%  ! Sektor kopieren
  5501.         sec_hd%=BYTE{buf%+sek%(i%,4)-2}         ! Sektormodus
  5502.         snr%=sek%(i%,0)               ! Sektornummer
  5503.         trk%=BYTE{sek%(i%,2)+buf%-1}  ! Tracknummer aus Header lesen
  5504.         floppy(0,track%,0,0,buf%,fdc3%,9,128+2,trk%)
  5505.         write_sec(sec_len%+17,snr%)   ! 17 Bytes mehr schreiben!
  5506.       ENDIF
  5507.     NEXT i%
  5508.   ENDIF
  5509. RETURN
  5510. '
  5511. PROCEDURE read_old_track
  5512.   .| Glob. Var.: tr$,i%,sec_anz%,a%,j%,buf%,sec_len%
  5513.   .| Felder    : sek%()
  5514.   .| Aufruf in : convert-1,do_trk_write-1,
  5515.   '     Daten aus Trackpuffer in TR$ kopieren um ihn zu schreiben
  5516.   '
  5517.   CLR tr$
  5518.   FOR i%=1 TO sec_anz%
  5519.     a%=sek%(i%,2)                               ! zeigt auf Beginn des Headers
  5520.     tr$=tr$+STRING$(MAX(0,a%-sek%(i%,1)-4),0)
  5521.     tr$=tr$+STRING$(3,&HF5)+CHR$(&HFE)
  5522.     FOR j%=sek%(i%,2) TO sek%(i%,2)+3
  5523.       tr$=tr$+CHR$(BYTE{buf%+j%-1})             ! Header
  5524.     NEXT j%
  5525.     tr$=tr$+CHR$(&HF7)                          ! Prüfsumme
  5526.     a%=sek%(i%,4)-2
  5527.     FOR j%=sek%(i%,3)+2 TO a%-5                 ! zeigt auf Datenbeginn
  5528.       IF BYTE{buf%+j%}=&H4E                     ! Lückenbytes holen
  5529.         tr$=tr$+CHR$(&H4E)
  5530.       ELSE
  5531.         tr$=tr$+CHR$(0)
  5532.       ENDIF
  5533.     NEXT j%
  5534.     IF sek%(i%,9)>0
  5535.       tr$=tr$+STRING$(3,&HF5)                     ! Sync
  5536.       tr$=tr$+CHR$(BYTE{buf%+a%})                 ! Sync + Datamark
  5537.       sec_len%=sek%(i%,9)
  5538.       tr$=tr$+STRING$(sec_len%,&HE5)+CHR$(&HF7)   ! leerer Sector
  5539.     ENDIF
  5540.   NEXT i%
  5541.   tr$=tr$+STRING$(sek%(sec_anz%+1,2)-sek%(sec_anz%+1,1),0)
  5542. RETURN
  5543. PROCEDURE anal_buf
  5544.   .| Glob. Var.: an$,trk_len_max%,ak%,trk_len%,buf%
  5545.   .| Ruft auf  : analyse,do_list
  5546.   .| Aufruf in : convert-1,do_trk_write-1,do_undo-1,menu_mess-1,
  5547.   an$=STRING$(trk_len_max%,0)
  5548.   BMOVE VARPTR(an$),ak%,trk_len_max%
  5549.   IF trk_len%>0
  5550.     BMOVE buf%,VARPTR(an$),LEN(an$)
  5551.     analyse(2)
  5552.   ENDIF
  5553.   do_list
  5554. RETURN
  5555. PROCEDURE gap           ! Track einlesen und normal anzeigen
  5556.   .| Glob. Var.: trk_len_max%,l_end%,bb$,trk_len%,buf%,an$,ak%,track%
  5557.   .| Felder    : l_end%()
  5558.   .| Ruft auf  : clear_buf,fuell,read_trk,alrt,read_adr_feld,search_sync
  5559.   .|     analyse,do_list
  5560.   .| Aufruf in : rst-1,fdc_readadress-1,fdc_null-1,lesen-1,
  5561.   LOCAL wwa%
  5562.   '
  5563.   clear_buf(1)
  5564.   fuell(0,2,trk_len_max%)               ! Lücken
  5565.   read_trk(trk_len_max%)
  5566.   IF l_end%>0
  5567.     l_end%(0)=l_end%
  5568.     bb$=STRING$(trk_len_max%-trk_len%,0)        ! Rest löschen
  5569.     BMOVE VARPTR(bb$),buf%+trk_len%,trk_len%
  5570.     an$=STRING$(trk_len_max%,0)                 ! Puffer zum suchen anlegen
  5571.     BMOVE VARPTR(an$),ak%,trk_len_max%          ! Status löschen??
  5572.     BMOVE buf%,VARPTR(an$),LEN(an$)             ! Track in Puffer kopieren
  5573.     wwa%=1
  5574.     IF track%=41                ! bei Track 41 besonderes
  5575.       wwa%=@alrt(2,"   Track 41?     ",1,"Gap|Anal")
  5576.     ENDIF
  5577.     IF wwa%=2
  5578.       read_adr_feld(@search_sync+3)
  5579.       analyse(0)
  5580.     ELSE
  5581.       analyse(1)                ! sonst einfache Analyse
  5582.     ENDIF
  5583.   ENDIF
  5584.   do_list
  5585. RETURN
  5586. PROCEDURE fdc_anal      ! Track analysieren
  5587.   .| Glob. Var.: trk_len_max%,l_end%,trk_len%,bb$,buf%,an$,ak%
  5588.   .| Ruft auf  : clear_buf,fuell,read_trk,set_aktpar,read_adr_feld,search_sync
  5589.   .|     analyse,alrt,do_list
  5590.   .| Aufruf in : menu_mess-1,
  5591.   '
  5592.   clear_buf(1)
  5593.   fuell(0,2,trk_len_max%)               ! Lücken
  5594.   read_trk(trk_len_max%)
  5595.   l_end%=trk_len%
  5596.   set_aktpar(0)
  5597.   IF trk_len%>0
  5598.     bb$=STRING$(trk_len_max%-trk_len%,0)        ! Rest löschen
  5599.     BMOVE VARPTR(bb$),buf%+trk_len%,trk_len%
  5600.     an$=STRING$(trk_len_max%,0)                 ! Puffer zum suchen anlegen
  5601.     BMOVE VARPTR(an$),ak%,trk_len_max%          ! Status löschen??
  5602.     BMOVE buf%,VARPTR(an$),LEN(an$)             ! Track in Puffer kopieren
  5603.     read_adr_feld(@search_sync+3)
  5604.     analyse(0)
  5605.   ELSE
  5606.     ~@alrt(1,"Keine Diskette drin oder was?",1,"Kann sein")
  5607.   ENDIF
  5608.   do_list
  5609.   '
  5610. RETURN
  5611. PROCEDURE fdc_diskanal  ! Disk ....
  5612.   .| Glob. Var.: erg%,trk_len_max%,l_end%,an$,ak%,buf%,track%,tpd%,seite%
  5613.   .| Ruft auf  : do_list,clr_out,out,was_ist,mdisk,read_trk,info,read_adr_feld
  5614.   .|     search_sync,analyse,fdc_do_info,out_do,lend,step_in
  5615.   .| Aufruf in : menu_mess-1,
  5616.   LOCAL wwa%
  5617.   '
  5618.   erg%=3
  5619.   do_list
  5620.   clr_out("ANALYSE DISK:")
  5621.   out("")
  5622.   REPEAT
  5623.     DO
  5624.       EXIT IF @was_ist>0
  5625.       mdisk
  5626.       read_trk(trk_len_max%)          ! Track lesen
  5627.       IF l_end%>0
  5628.         info
  5629.         an$=STRING$(trk_len_max%,0)
  5630.         BMOVE VARPTR(an$),ak%,LEN(an$)  ! Status löschen
  5631.         BMOVE buf%,VARPTR(an$),LEN(an$) ! Daten in An$ holen für Analyse
  5632.         read_adr_feld(@search_sync+3)
  5633.         analyse(0)
  5634.       ENDIF
  5635.       fdc_do_info
  5636.       out_do
  5637.       lend(0)
  5638.       EXIT IF track%>=tpd%            ! Fertig?
  5639.       '
  5640.       seite%=1-seite%
  5641.       IF seite%=0
  5642.         step_in
  5643.       ENDIF
  5644.     LOOP
  5645.   UNTIL 1
  5646. RETURN
  5647. PROCEDURE fdc_head      ! Spur wechseln und einlesen
  5648.   .| Glob. Var.: track%
  5649.   .| Ruft auf  : alrt,was_ist,step_out,dum,step_in,lesen
  5650.   .| Aufruf in : menu_mess-1,
  5651.   LOCAL stp%
  5652.   stp%=@alrt(2,"Lesetest mit Spurwechseln?",1,"Minus|Nix|Plus")
  5653.   DO
  5654.     EXIT IF @was_ist>0 OR track%>80
  5655.     REPEAT
  5656.       ON stp% GOSUB step_out,dum,step_in
  5657.     UNTIL track%<>41
  5658.     lesen
  5659.   LOOP
  5660. RETURN
  5661. PROCEDURE fdc_null      ! Spuren löschen
  5662.   .| Glob. Var.: wa$,a%,el%,track%,trk_len_max%,buf%,seite%
  5663.   .| Ruft auf  : alrt,eingabe,wandlung,info_line,write_trk,step_in,gap
  5664.   .| Aufruf in : menu_mess-1,
  5665.   LOCAL sd%,wi%,wtrk%,wwa%,w$,a$,bb$
  5666.   '
  5667.   IF @alrt(2,"   Achtung! Diskette wird   |   gelöscht!! ",2,wa$)=1
  5668.     a%=@eingabe("Wieviel Spuren löschen",80)
  5669.     IF el%>0
  5670.       wtrk%=track%+a%-1
  5671.       sd%=@eingabe("Anzahl der Seiten",2)
  5672.       wwa%=@alrt(2,"    Was schreiben?    ",1,"Puffer|Muster|Abbruch")
  5673.       IF wwa%=2
  5674.         a$=STR$(@eingabe("Bitte Muster eingeben:",0))
  5675.         wandlung(a$)
  5676.         IF w$=""
  5677.           w$=CHR$(0)
  5678.         ENDIF
  5679.         bb$=STRING$(trk_len_max%/LEN(w$),w$)
  5680.         BMOVE VARPTR(bb$),buf%,trk_len_max%
  5681.         CLR bb$
  5682.       ENDIF
  5683.       IF wwa%<3
  5684.         FOR wi%=track% TO wtrk%
  5685.           CLR seite%
  5686.           info_line
  5687.           write_trk(trk_len_max%)
  5688.           IF sd%=2
  5689.             seite%=1
  5690.             info_line
  5691.             write_trk(trk_len_max%)
  5692.           ENDIF
  5693.           step_in
  5694.         NEXT wi%
  5695.       ENDIF
  5696.     ENDIF
  5697.     gap
  5698.   ENDIF
  5699. RETURN
  5700. PROCEDURE fdc_trkinfo
  5701.   .| Glob. Var.: erg%
  5702.   .| Ruft auf  : clr_out,fdc_do_info,out_do
  5703.   .| Aufruf in : menu_mess-1,
  5704.   erg%=3
  5705.   clr_out("")
  5706.   fdc_do_info
  5707.   out_do
  5708. RETURN
  5709. PROCEDURE fdc_do_info
  5710.   .| Glob. Var.: track%,seite%,sec_max%,fdci%
  5711.   .| Felder    : se_inf$(),fdc_info$()
  5712.   .| Ruft auf  : out
  5713.   .| Aufruf in : fdc_diskanal-1,fdc_trkinfo-1,
  5714.   LOCAL a%,i%
  5715.   '
  5716.   out("Track "+STR$(track%)+"  Seite "+STR$(seite%))
  5717.   out("")
  5718.   out("Track Seite Sector Länge")
  5719.   CLR a%
  5720.   WHILE a%<sec_max%
  5721.     EXIT IF se_inf$(a%)<>""     ! first SECTOR
  5722.     INC a%
  5723.   WEND
  5724.   WHILE a%<sec_max%
  5725.     EXIT IF se_inf$(a%)=""      ! last Sektor
  5726.     INC a%
  5727.   WEND
  5728.   INC a%
  5729.   '
  5730.   FOR i%=0 TO MIN(25,a%)
  5731.     out(se_inf$(i%))
  5732.   NEXT i%
  5733.   FOR i%=0 TO fdci%
  5734.     out(fdc_info$(i%))
  5735.   NEXT i%
  5736. RETURN
  5737. PROCEDURE fdc_protect
  5738.   .| Glob. Var.: a$,b$,b.ox%,boxtxt&,boxaktiv&,wr_old%,buf%,fdc3%,wr%
  5739.   .|     fdc_stat%,esc$
  5740.   .| Ruft auf  : put_char,box_draw,floppy,objc_update,mousek,box_undraw,irq
  5741.   .| Aufruf in : menu_mess-1,
  5742.   a$="Schreibschutz"
  5743.   b$=" "
  5744.   put_char(b.ox%,boxtxt&,a$)
  5745.   put_char(b.ox%,boxaktiv&,b$)
  5746.   box_draw(b.ox%)
  5747.   '
  5748.   wr_old%=-1
  5749.   DO
  5750.     floppy(0,0,0,0,buf%,fdc3%,8,&H80,0)
  5751.     wr%=fdc_stat% AND &H40
  5752.     IF wr%<>wr_old%
  5753.       wr_old%=wr%
  5754.       IF wr%>0
  5755.         b$="  "
  5756.       ELSE
  5757.         b$="in"
  5758.       ENDIF
  5759.       b$=b$+"aktiv"
  5760.       put_char(b.ox%,boxaktiv&,b$)
  5761.       objc_update(b.ox%,boxaktiv&)
  5762.     ENDIF
  5763.     '
  5764.     EXIT IF @mousek=2 OR INKEY$=esc$
  5765.   LOOP
  5766.   box_undraw(b.ox%)
  5767.   irq
  5768. RETURN
  5769. '
  5770. PROCEDURE analyse(analyse%)
  5771.   .| Glob. Var.: zg%,a1%,a2%,p_adr%,zg_adr%,total%,a4%,senf$,sec_anz%,pos%
  5772.   .|     fdc2%,diff%,trk_len%,max_diff%,a3%,scz%,fdc1%,snr%,sgr%,buf%,hd%,sz%
  5773.   .|     sec_end%,sec_len%,sector%,j%,track%,laenge%,fdc3%,byt%,trk_len_max%
  5774.   .| Felder    : sek%(),se_inf$(),byt_sec%()
  5775.   .| Ruft auf  : anal_init,head,search_head,fuell,anal_err,anal_ctrl,mark
  5776.   .|     search_mark,floppy,read_sector,info_line,anal_exit
  5777.   .| Aufruf in : anal_buf-1,gap-2,fdc_anal-1,fdc_diskanal-1,
  5778.   LOCAL a%,sid%,xd%,trk%
  5779.   '
  5780.   anal_init
  5781.   CLR zg%,a1%,a2%,p_adr%,zg_adr%
  5782.   DO
  5783.     EXIT IF total%=0 AND analyse%=0
  5784.     '
  5785.   sync_a0:
  5786.     CLR a4%,senf$
  5787.     IF analyse%=1
  5788.       a%=@head(zg%)
  5789.     ELSE
  5790.       a%=@search_head(zg%)
  5791.     ENDIF
  5792.     EXIT IF a%=0                        ! Kein 'FE A1' mehr gefunden
  5793.     ADD a%,2
  5794.     p_adr%=a%
  5795.     fuell(a1%,2,a%)                     ! Lücken
  5796.     fuell(a%,1,a%+4)                    ! Header = Fett
  5797.     sek%(sec_anz%+1,1)=a1%              ! Beginn Gap 0
  5798.     sek%(sec_anz%+1,2)=a%
  5799.     a1%=a%
  5800.     a2%=a1%
  5801.     '
  5802.     IF analyse%=0
  5803.       pos%=CARD{fdc2%+4+zg_adr%*4}
  5804.       diff%=ABS((trk_len%*(pos%/total%)-6)-a%)
  5805.       IF diff%>max_diff%                ! Differenz soll nicht > ?? sein
  5806.         anal_err(sec_anz%+1,10)         ! Differenz zu groß
  5807.         zg%=p_adr%                      ! sonst in Tabelle weiter
  5808.         GOTO sync_a0
  5809.       ENDIF
  5810.     ENDIF
  5811.     EXIT IF pos%=0 AND analyse%=0
  5812.     ' ------------------- Kontrolle ------------
  5813.     a3%=a1%-1
  5814.     IF analyse%=0
  5815.       scz%=zg_adr%*6
  5816.       trk%=BYTE{fdc1%+scz%}
  5817.       sid%=BYTE{fdc1%+scz%+1}           ! aus Adreßfeld lesen
  5818.       snr%=BYTE{fdc1%+scz%+2}
  5819.       sgr%=BYTE{fdc1%+scz%+3}
  5820.       IF BYTE{fdc1%+scz%+4}+BYTE{fdc1%+scz%+5}=0 ! Adressfeld_status
  5821.         INC zg_adr%
  5822.         zg%=p_adr%
  5823.         GOTO sync_a0
  5824.       ENDIF
  5825.     ELSE
  5826.       trk%=BYTE{a3%+buf%}
  5827.       sid%=BYTE{a3%+buf%+1}
  5828.       snr%=BYTE{a3%+buf%+2}
  5829.       sgr%=BYTE{a3%+buf%+3}
  5830.     ENDIF
  5831.     sek%(sec_anz%+1,11)=trk%            ! Kopieren in Sek%(feld)
  5832.     sek%(sec_anz%+1,12)=sid%
  5833.     sek%(sec_anz%+1,13)=snr%
  5834.     sek%(sec_anz%+1,14)=sgr%
  5835.     '
  5836.     IF snr%>25
  5837.       snr%=0                    ! ???
  5838.     ENDIF
  5839.     '
  5840.     FOR hd%=11 TO 14
  5841.       senf$=senf$+"   "+HEX$(sek%(sec_anz%+1,hd%),2)
  5842.     NEXT hd%
  5843.     anal_ctrl
  5844.     ' ------------------- Datamark suchen --------------
  5845.     zg%=a%
  5846.     IF analyse%=1
  5847.       a%=@mark(zg%)
  5848.     ELSE
  5849.       a%=@search_mark(zg%)
  5850.     ENDIF
  5851.     IF a%=0
  5852.       anal_err(snr%,2)
  5853.       sek%(snr%,7)=1            ! Kein Datamark
  5854.       senf$=senf$+" RNF"
  5855.       INC zg_adr%
  5856.       ADD a1%,4
  5857.       zg%=p_adr%
  5858.       GOTO sync_a0
  5859.     ENDIF
  5860.     INC a%
  5861.     '
  5862.     xd%=sek%(sec_anz%+1,2)-sek%(sec_anz%,5)
  5863.     IF (xd%>150 AND sec_anz%>0) OR (xd%>176 AND sec_anz%<1)
  5864.       anal_err(snr%,6)          ! Abstand Sektor - nächster Header zu groß
  5865.     ENDIF
  5866.     IF sek%(sec_anz%+1,2)+55<a%
  5867.       anal_err(snr%,1)          ! Abstand Header-Sektor
  5868.     ENDIF
  5869.     INC a%
  5870.     fuell(a1%+4,2,a%)           ! Gaps hell anzeigen
  5871.     a2%=a%
  5872.     '
  5873.     sek%(sec_anz%+1,3)=a1%+4    ! Anfang Gap merken
  5874.     sek%(sec_anz%+1,4)=a%       ! Anfang der Daten merken
  5875.     sz%=zg_adr%*6               ! zeigt auf Beginn des Headers
  5876.     a1%=a%
  5877.     '
  5878.     IF sek%(sec_anz%,5)>a1%     ! war im Sektor ein neuer Header?
  5879.       anal_err(snr%-1,8)        ! Ja
  5880.       sek%(sec_anz%-1,8)=1
  5881.       se_inf$(sec_anz%-1)=se_inf$(sec_anz%-1)+" CUT"
  5882.       sec_end%=sek%(sec_anz%+1,2)-8
  5883.       fuell(sec_end%,2,sec_end%+8)      ! Gaps auffüllen
  5884.       sek%(sec_anz%,9)=MAX(0,(sec_end%-sek%(sec_anz%,4))-1)     ! Sektorlänge?
  5885.     ENDIF
  5886.     '
  5887.     IF analyse%=0
  5888.       BMOVE fdc1%+sz%,sek%(sec_anz%+1,2)+buf%-1,6       ! Header einfügen
  5889.     ENDIF
  5890.     sec_len%=byt_sec%(sgr% AND 3)
  5891.     sector%=snr%
  5892.     IF sec_anz%>0
  5893.       j%=1
  5894.       WHILE j%<=sec_anz%+1
  5895.         IF sek%(j%,0)=sector%
  5896.           a4%=99
  5897.         ENDIF
  5898.         EXIT IF a4%=99
  5899.         INC j%
  5900.       WEND
  5901.     ENDIF
  5902.     '
  5903.     IF analyse%=0
  5904.       IF a4%<>99                        ! wenn nicht doppelter Sektor
  5905.         '
  5906.         floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H82,trk%)
  5907.         read_sector(sector%,sec_len%+2) ! Sektor lesen
  5908.         floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H82,track%)
  5909.         info_line               ! nur so
  5910.         '
  5911.         IF byt%>0
  5912.           IF sec_len%>0
  5913.             IF a1%+sec_len%>trk_len%
  5914.               sec_len%=trk_len%-(a1%-1)
  5915.             ENDIF
  5916.             IF sec_len%>0
  5917.               BMOVE fdc3%,a1%+buf%-1,sec_len%
  5918.             ENDIF
  5919.           ENDIF
  5920.         ELSE
  5921.           sek%(sec_anz%,7)=2            ! Datamark da, aber kein Sektor gelesen
  5922.           senf$=senf$+" RNF *"
  5923.         ENDIF
  5924.       ELSE
  5925.         sek%(sec_anz%,7)=3              ! Datamark da, aber Sektor doppelt
  5926.         senf$=senf$+" Double"
  5927.         anal_err(snr%+1,5)              ! Sektornummer doppelt
  5928.       ENDIF
  5929.     ENDIF
  5930.     '
  5931.     sek%(sec_anz%+1,0)=sector%          ! Sektornummer merken
  5932.     sek%(sec_anz%+1,9)=sec_len%         ! Sektorlänge
  5933.     sek%(sec_anz%+1,5)=a1%+sec_len%     ! zeigt auf Ende der Daten
  5934.     zg%=p_adr%
  5935.     a1%=a1%+sec_len%
  5936.     EXIT IF a1%>trk_len_max% OR zg%>trk_len_max%
  5937.     INC zg_adr%
  5938.     se_inf$(sec_anz%)=senf$
  5939.     INC sec_anz%
  5940.   LOOP
  5941.   '
  5942.   IF sek%(sec_anz%,5)>a1%       ! war im letzten Sektor ein neuer Header?
  5943.     anal_err(snr%+1,8)          ! Ja
  5944.     sek%(sec_anz%-1,8)=1
  5945.     se_inf$(sec_anz%-1)=se_inf$(sec_anz%-1)+"CUT"
  5946.     sec_end%=sek%(sec_anz%+1,2)-8
  5947.     fuell(sec_end%,2,sec_end%+8)                      ! Gaps auffüllen
  5948.     sek%(sec_anz%,9)=(sec_end%-sek%(sec_anz%,4))-1    ! Sektorlänge??
  5949.   ENDIF
  5950.   '
  5951.   anal_exit
  5952. RETURN
  5953. PROCEDURE fuell(von%,was%,bis%)
  5954.   .| Glob. Var.: ak%
  5955.   .| Aufruf in : fdc_trackconfig-3,fdc_secread-1,gap-1,fdc_anal-1,analyse-5
  5956.   .|     anal_init-1,anal_exit-1,
  5957.   LOCAL zahl%,a$
  5958.   zahl%=bis%-von%
  5959.   IF zahl%>0
  5960.     a$=STRING$(zahl%,was%)
  5961.     BMOVE V:a$,ak%+von%-1,zahl%
  5962.     CLR a$
  5963.   ENDIF
  5964. RETURN
  5965. PROCEDURE anal_init
  5966.   .| Glob. Var.: i%,sec_max%,fdcinf_max%,zg%,sec_anz%,im$,fdci%,total%,fdc2%
  5967.   .|     a1%,a3%
  5968.   .| Felder    : sek%(),se_inf$(),fdc_info$()
  5969.   .| Ruft auf  : fuell
  5970.   .| Aufruf in : analyse-1,
  5971.   ARRAYFILL sek%(),0
  5972.   FOR i%=1 TO sec_max%
  5973.     se_inf$(i%)=""
  5974.   NEXT i%
  5975.   FOR i%=1 TO fdcinf_max%
  5976.     fdc_info$(i%)=""
  5977.   NEXT i%
  5978.   zg%=1
  5979.   CLR sec_anz%,im$,fdci%
  5980.   fuell(1,2,5)
  5981.   total%=CARD{fdc2%}
  5982.   a1%=1
  5983.   a3%=5
  5984. RETURN
  5985. PROCEDURE anal_ctrl
  5986.   .| Glob. Var.: trk%,track%,snr%,sid%,seite%,sgr%
  5987.   .| Ruft auf  : anal_err
  5988.   .| Aufruf in : analyse-1,
  5989.   IF trk%<>track%               ! steht richtige Tracknummer im Header?
  5990.     anal_err(snr%,4)
  5991.   ENDIF
  5992.   IF sid%<>seite%               ! Steht richtige Seite im Header?
  5993.     anal_err(snr%,7)
  5994.   ENDIF
  5995.   IF snr%>22                    ! Sektornummer?
  5996.     anal_err(snr%,9)
  5997.   ENDIF
  5998.   IF sgr%<>2
  5999.     anal_err(snr%,3)            ! Sektorlänge?
  6000.   ENDIF
  6001. RETURN
  6002. PROCEDURE anal_exit
  6003.   .| Glob. Var.: a1%,trk_len%,trk_len_max%,sec_anz%
  6004.   .| Felder    : sek%()
  6005.   .| Ruft auf  : fuell
  6006.   .| Aufruf in : analyse-1,
  6007.   IF a1%>trk_len%               ! Wenn Sektorende > Trackende
  6008.     a1%=trk_len%-2
  6009.   ENDIF
  6010.   fuell(a1%,2,trk_len_max%)
  6011.   sek%(1,1)=0
  6012.   sek%(sec_anz%+1,1)=a1%        ! Beginn des Tracknachspanns
  6013.   sek%(sec_anz%+1,2)=trk_len%
  6014. RETURN
  6015. PROCEDURE anal_err(fsn%,anl_err%)
  6016.   .| Glob. Var.: fdci%,fdcinf_max%
  6017.   .| Felder    : fdc_info$(),im$()
  6018.   .| Aufruf in : analyse-7,anal_ctrl-4,
  6019.   IF fdci%<fdcinf_max%
  6020.     fdc_info$(fdci%)=" Sector:"+STR$(fsn%)+" "+im$(anl_err%)
  6021.     INC fdci%
  6022.   ENDIF
  6023. RETURN
  6024. '
  6025. FUNCTION head(ab%)
  6026.   .| Glob. Var.: an$
  6027.   .| Aufruf in : analyse-1,
  6028.   '                     ! Sucht nach Header     (A1-FE))
  6029.   RETURN INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HFE))
  6030. ENDFUNC
  6031. FUNCTION search_sync
  6032.   .| Glob. Var.: a$,trk_len%,an$
  6033.   .| Aufruf in : gap-1,fdc_anal-1,fdc_diskanal-1,
  6034.   LOCAL a%,az%
  6035.   a$=CHR$(&HA1)+CHR$(&HFE)
  6036.   IF trk_len%>0         ! Routine zählt Header
  6037.     CLR a%,az%
  6038.     DO
  6039.       a%=INSTR(a%+1,an$,a$)
  6040.       EXIT IF a%=0
  6041.       INC az%
  6042.     LOOP
  6043.   ENDIF
  6044.   RETURN az%
  6045. ENDFUNC
  6046. FUNCTION search_head(ab%)
  6047.   .| Glob. Var.: an$
  6048.   .| Aufruf in : analyse-1,
  6049.   LOCAL a%,i%           ! Sucht nach Header  (A1-FC(FD,FE,FF))
  6050.   CLR i%
  6051.   WHILE i%<4
  6052.     a%=INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HFC+i%))
  6053.     EXIT IF a%>0
  6054.     INC i%
  6055.   WEND
  6056.   RETURN a%
  6057. ENDFUNC
  6058. FUNCTION search_mark(ab%)
  6059.   .| Glob. Var.: an$
  6060.   .| Aufruf in : analyse-1,
  6061.   LOCAL a%,i%           ! Sucht nach Datenmarke  (A1-F8(F9,FA,FB))
  6062.   CLR i%
  6063.   WHILE i%<4
  6064.     a%=INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HF8+i%))
  6065.     EXIT IF a%>0
  6066.     INC i%
  6067.   WEND
  6068.   RETURN a%
  6069. ENDFUNC
  6070. FUNCTION mark(ab%)
  6071.   .| Glob. Var.: an$
  6072.   .| Aufruf in : analyse-1,
  6073.   '                   Sucht nach Datenmarke (A1-FB))
  6074.   RETURN INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HFB))
  6075. ENDFUNC
  6076. '
  6077. FUNCTION hdumschaltung(neu%)
  6078.   .| Glob. Var.: tt!
  6079.   .| Ruft auf  : alrt
  6080.   .| Aufruf in : fdc_steprate-3,
  6081.   LOCAL alt%
  6082.   ' IN:  neu%  -1: Aktuellen Modus erfragen
  6083.   '             0: Doppelte Dichte
  6084.   '             3: Hohe Dichte   BIT 0=8-16 MHz   BIT 1=HD-Erkennung
  6085.   ' OUT: Funktionswert   Alter Wert (0 oder 3)
  6086.   IF tt!<>0
  6087.     alt%=DPEEK(&HFFFF860E) AND 3
  6088.     IF neu%<>-1
  6089.       SDPOKE &HFFFF860E,neu%
  6090.     ENDIF
  6091.   ELSE
  6092.     ~@alrt(1,"Nur beim ATARI-TT möglich!",1," Aha ")
  6093.   ENDIF
  6094.   RETURN alt%
  6095. ENDFUNC
  6096. FUNCTION floprate(stepa%,stepb%)
  6097.   .| Glob. Var.: rom_version%
  6098.   .| Aufruf in : fdc_steprate-2,
  6099.   LOCAL curra%,currb%,loca%
  6100.   '
  6101.   ' IN: stepa%   -1: Steprate für A erfragen
  6102.   '              0-3 Steprate
  6103.   '     stepb%   -1: Steprate für B erfragen
  6104.   '              0-3 Steprate
  6105.   ' OUT: FUNCTION floprate()   akt. Steprate für A (unteres Wort)
  6106.   '                            akt. Steprate für B (oberes Wort)
  6107.   IF stepa%<>-1
  6108.     SDPOKE &H440,stepa%
  6109.   ENDIF
  6110.   IF rom_version%>=&H104
  6111.     curra%=XBIOS(41,0,stepa%)
  6112.     currb%=XBIOS(41,1,stepb%)
  6113.   ELSE
  6114.     loca%=&HA4C
  6115.     IF rom_version%=&H100
  6116.       loca%=&HA06
  6117.     ENDIF
  6118.     curra%=CARD{loca%+2}
  6119.     currb%=CARD{loca%+6}
  6120.     IF stepa%<>-1
  6121.       SDPOKE loca%+2,stepa%
  6122.     ENDIF
  6123.     IF stepb%<>-1
  6124.       SDPOKE loca%+6,stepb%
  6125.     ENDIF
  6126.   ENDIF
  6127.   RETURN curra%+&H10000*currb%
  6128. ENDFUNC
  6129. PROCEDURE chk_fdc
  6130.   .| Glob. Var.: mode%,f.dc%
  6131.   .| Ruft auf  : deselect
  6132.   .| Aufruf in : haupt_dialog-2,do_exit-1,
  6133.   IF mode%=f.dc%
  6134.     deselect
  6135.   ENDIF
  6136. RETURN
  6137. ' ---------------------- RAM Routinen --------------------------
  6138. PROCEDURE ram_read
  6139.   .| Glob. Var.: utis%,ram_addr%,buf%,bps%,old_ram_addr%
  6140.   .| Ruft auf  : alrt
  6141.   .| Aufruf in : prg_load-1,lesen-1,
  6142.   IF C:utis%(&H600,L:ram_addr%,L:buf%,L:bps%-1)<>0
  6143.     ram_addr%=old_ram_addr%
  6144.     ~@alrt(3,"Diese Adresse hat einen |Busfehler ausgelöst!",1,"Abbruch")
  6145.   ENDIF
  6146.   old_ram_addr%=ram_addr%
  6147. RETURN
  6148. PROCEDURE ram_write
  6149.   .| Glob. Var.: utis%,buf%,ram_addr%,bps%,old_ram_addr%
  6150.   .| Ruft auf  : alrt
  6151.   .| Aufruf in : schreiben-1,
  6152.   IF C:utis%(&H600,L:buf%,L:ram_addr%,L:bps%-1)<>0
  6153.     ram_addr%=old_ram_addr%
  6154.     ~@alrt(3,"Hierhin können Sie nicht |schreiben, und wenn Sie|einen Handstand machen.",1,"Abbruch")
  6155.   ENDIF
  6156. RETURN
  6157. PROCEDURE ram_adress_read
  6158.   .| Glob. Var.: a%,ram_addr%,el%
  6159.   .| Ruft auf  : change,eingabe,lesen,do_list
  6160.   .| Aufruf in : menu_mess-1,stat_line-1,
  6161.   change
  6162.   a%=@eingabe("RAM lesen ab Adresse:",ram_addr%)
  6163.   IF el%>0
  6164.     ram_addr%=a%
  6165.     lesen
  6166.     do_list
  6167.   ENDIF
  6168. RETURN
  6169. PROCEDURE ram_adress_write
  6170.   .| Glob. Var.: a%,ram_addr%,el%
  6171.   .| Ruft auf  : eingabe,schreiben
  6172.   .| Aufruf in : menu_mess-1,
  6173.   a%=@eingabe("RAM schreiben ab Adresse:",ram_addr%)
  6174.   IF el%>0
  6175.     ram_addr%=a%
  6176.     schreiben
  6177.   ENDIF
  6178. RETURN
  6179. PROCEDURE ram_save
  6180.   .| Glob. Var.: bc%,ram_addr%,el%,a%,erg%,device%,b%,buf$,i%,bb%,utis%,hdl%
  6181.   .| Ruft auf  : eingabe,dev,alrt,fwrite,fclose
  6182.   .| Aufruf in : menu_mess-1,
  6183.   bc%=@eingabe("Ab Adresse:",ram_addr%)
  6184.   IF el%>0
  6185.     a%=@eingabe("bis Adresse:",0)
  6186.     IF el%>0
  6187.       IF EVEN(a%)=FALSE
  6188.         INC a%                  ! darf nicht ungerade Anzahl sein?
  6189.       ENDIF
  6190.       erg%=1
  6191.       dev("RAM speichern",32)
  6192.       IF device%<>99
  6193.         b%=a%-bc%
  6194.         IF b%>0
  6195.           buf$=STRING$(1024,0)
  6196.           FOR i%=0 TO b%/1024-1
  6197.             bb%=V:buf$
  6198.             IF C:utis%(&H600,L:bc%+i%*1024,L:bb%,L:1024-1)<>0
  6199.               ~@alrt(3,"Busfehler aufgetreten!",1," Aha ")
  6200.               i%=b%/1024+1
  6201.               CLR b%
  6202.             ELSE
  6203.               fwrite(hdl%,buf$)
  6204.             ENDIF
  6205.           NEXT i%
  6206.           IF b%/1024<>INT(b%/1024) AND b%>1024  ! und den Rest
  6207.             a%=b%-(INT(b%/1024)*1024)
  6208.             buf$=STRING$(a%,0)
  6209.             IF C:utis%(&H600,L:bc%+i%*1024,L:V:buf$,L:(LEN(buf$))-1)<>0
  6210.               ~@alrt(3,"Busfehler aufgetreten!",1," Aha ")
  6211.             ELSE
  6212.               fwrite(hdl%,buf$)
  6213.             ENDIF
  6214.           ENDIF
  6215.         ENDIF
  6216.         CLR buf$
  6217.         ~@fclose(hdl%)
  6218.       ENDIF
  6219.     ENDIF
  6220.   ENDIF
  6221. RETURN
  6222. PROCEDURE ram_load
  6223.   .| Glob. Var.: fi$,fhandle%,rfl%,a%,el%,t%,ram_addr%,tz%,buf%
  6224.   .| Ruft auf  : fsel$,fopen,fseek,alrt,eingabe,fread$,fread2,fclose
  6225.   .| Aufruf in : menu_mess-1,
  6226.   LOCAL wwa%
  6227.   '
  6228.   fi$=@fsel$("*.*","","Datei in RAM einlesen",3)
  6229.   IF EXIST(fi$)=TRUE
  6230.     fhandle%=@fopen(fi$,0)
  6231.     rfl%=@fseek(0,fhandle%,2)
  6232.     ~@fseek(0,fhandle%,0)
  6233.     wwa%=@alrt(2,"Datei ab Cursorposition|einlesen?",1,"RAM|Puffer|Abbruch")
  6234.     IF wwa%<3
  6235.       a%=@eingabe("Wieviele Bytes einlesen?",rfl%)
  6236.       IF el%>0
  6237.         IF wwa%=1
  6238.           FOR t%=ram_addr%+tz% TO ram_addr%+tz%+MIN(rfl%,a%)-1
  6239.             SPOKE t%,ASC(@fread$(fhandle%,1))
  6240.           NEXT t%
  6241.         ELSE
  6242.           fread2(fhandle%,buf%+tz%,MIN(rfl%,a%))
  6243.         ENDIF
  6244.       ENDIF
  6245.     ENDIF
  6246.     ~@fclose(fhandle%)
  6247.   ENDIF
  6248. RETURN
  6249. PROCEDURE prg_load
  6250.   .| Glob. Var.: prg_adr%,prg_fi$,fi$,ram_addr%,tz%,z%,xt%,yt%
  6251.   .| Ruft auf  : alrt,dec_hex_val$,fsel$,ram_read,do_list
  6252.   .| Aufruf in : menu_mess-1,
  6253.   IF prg_adr%>0
  6254.     IF @alrt(2,RIGHT$(prg_fi$,40)+"|ab Adresse "+@dec_hex_val$(prg_adr%,8)+"|ist noch im Speicher.|Freigeben?",1,"Ok| Nein ")=1
  6255.       ~MFREE(prg_adr%)
  6256.       CLR prg_adr%
  6257.     ENDIF
  6258.   ELSE
  6259.     fi$=@fsel$("*.PRG","","Programm laden",4)
  6260.     IF EXIST(fi$)=TRUE
  6261.       prg_fi$=fi$
  6262.       prg_adr%=GEMDOS(75,3,L:V:prg_fi$,L:0,L:0) ! Pexec
  6263.       IF prg_adr%>0
  6264.         ram_addr%=prg_adr%
  6265.         CLR tz%,z%,xt%,yt%
  6266.         ram_read
  6267.       ELSE
  6268.         ~@alrt(3,"Kein Speicher frei|oder anderer Fehler. ",1,"Abbruch")
  6269.       ENDIF
  6270.       do_list
  6271.     ENDIF
  6272.   ENDIF
  6273. RETURN
  6274. PROCEDURE clr_prg_load
  6275.   .| Glob. Var.: prg_adr%
  6276.   .| Ruft auf  : alrt
  6277.   .| Aufruf in : menu_mess-1,
  6278.   IF prg_adr%>0
  6279.     IF @alrt(2,"Geladenes Programm belegt|noch Speicher.|Freigeben?",1,"Ok| Nein ")=1
  6280.       ~MFREE(prg_adr%)
  6281.       CLR prg_adr%
  6282.     ENDIF
  6283.   ELSE
  6284.     ~@alrt(3,"Kein Programm geladen.",1," Aha ")
  6285.   ENDIF
  6286. RETURN
  6287. PROCEDURE disass_konv
  6288.   .| Glob. Var.: ram.konv%
  6289.   .| Ruft auf  : box_draw,form_do,clr_state,box_undraw
  6290.   .| Aufruf in : menu_mess-1,
  6291.   LOCAL ex_obj&
  6292.   '
  6293.   box_draw(ram.konv%)
  6294.   ex_obj&=@form_do(ram.konv%) AND &HFF
  6295.   clr_state(ram.konv%,ex_obj&,1)
  6296.   box_undraw(ram.konv%)
  6297. RETURN
  6298. PROCEDURE ram_cookie
  6299.   .| Glob. Var.: erg%
  6300.   .| Ruft auf  : clr_out,search_cookie,out_do
  6301.   .| Aufruf in : menu_mess-1,
  6302.   erg%=3
  6303.   clr_out("Cookies")
  6304.   ~@search_cookie("",1)
  6305.   out_do
  6306. RETURN
  6307. PROCEDURE ram_test
  6308.   .| Glob. Var.: erg%
  6309.   .| Ruft auf  : clr_out,out,do_ram_test,lesen,out_do
  6310.   .| Aufruf in : menu_mess-1,
  6311.   erg%=3
  6312.   clr_out("Speicher-Test")
  6313.   out("ST-RAM")
  6314.   do_ram_test(0)
  6315.   IF GEMDOS(68,L:-1,0)<>-32
  6316.     out("TT-RAM")
  6317.     do_ram_test(1)
  6318.   ENDIF
  6319.   lesen
  6320.   out_do
  6321. RETURN
  6322. PROCEDURE do_ram_test(par%)
  6323.   .| Glob. Var.: max%
  6324.   .| Ruft auf  : ram_check,do_ram_test
  6325.   .| Aufruf in : ram_test-2,do_ram_test-1,
  6326.   LOCAL max#,adr%
  6327.   IF par%=0
  6328.     max%=GEMDOS(72,L:-1,0)
  6329.     adr%=GEMDOS(72,L:max%,0)    ! 0=nur ST-RAM
  6330.   ELSE
  6331.     max%=GEMDOS(68,L:-1,1)
  6332.     adr%=GEMDOS(68,L:max%,1)    ! 1=nur TT-RAM
  6333.   ENDIF
  6334.   IF adr%>0
  6335.     ram_check(adr%,max%)        ! Speicher testen
  6336.     do_ram_test(par%)           ! und nächsten Block
  6337.     IF adr%>0
  6338.       ~MFREE(adr%)
  6339.     ENDIF
  6340.   ENDIF
  6341. RETURN
  6342. PROCEDURE ram_check(a1%,a2%)
  6343.   .| Glob. Var.: abb%,b%,buf_size%,buf%,utis%,a%
  6344.   .| Ruft auf  : dec_hex_val$,out,out_do,lend,was_ist
  6345.   .| Aufruf in : do_ram_test-1,
  6346.   LOCAL a$,w$,ab%,j%,i%,x%,w%
  6347.   '
  6348.   a$="Adresse: "+@dec_hex_val$(a1%,9)+" - "+@dec_hex_val$(a1%+a2%-1,9)
  6349.   a$=a$+" = "+@dec_hex_val$(a2%,9)+" Bytes"
  6350.   out(a$)
  6351.   CLR abb%
  6352.   RESTORE ram_check_data
  6353.   '
  6354. ram_check_data:
  6355.   DATA &H55,&HAA,&H00,&HFF,*
  6356.   '
  6357.   REPEAT
  6358.     READ w$
  6359.     EXIT IF w$="*"
  6360.     w%=VAL(w$)
  6361.     '
  6362.     out("Test: "+@dec_hex_val$(w%,3))
  6363.     out_do
  6364.     lend(1)
  6365.     '
  6366.     b%=MIN(a2%,buf_size%)         ! Puffergröße
  6367.     a$=STRING$(b%,w%)
  6368.     BMOVE V:a$,buf%,b%
  6369.     ab%=a2%/b%
  6370.     '
  6371.     FOR i%=0 TO ab%-1
  6372.       abb%=@was_ist
  6373.       EXIT IF abb%>0
  6374.       x%=a1%+i%*b%
  6375.       BMOVE buf%,x%,b%
  6376.       '
  6377.       IF C:utis%(&H500,L:buf%,L:x%,L:b%/4-1)<>0
  6378.         FOR j%=0 TO b%-1
  6379.           IF BYTE{buf%+j%}<>BYTE{x%+j%}
  6380.             out("Addresse:"+@dec_hex_val$(x%+j%,9)+"  Wert: "+@dec_hex_val$(BYTE{x%+j%},3)+"  Soll:"+@dec_hex_val$(w%,3))
  6381.           ENDIF
  6382.         NEXT j%
  6383.       ENDIF
  6384.     NEXT i%
  6385.     '
  6386.     a%=a2%-ab%*b%       ! Rest der noch zu prüfen ist
  6387.     IF a%>4
  6388.       x%=a1%+ab%*b%     ! ab Adresse ...
  6389.       BMOVE buf%,x%,a%  ! Muster schreiben
  6390.       '
  6391.       IF C:utis%(&H500,L:buf%,L:x%,L:a%/4-1)<>0
  6392.         FOR j%=0 TO b%-1
  6393.           IF BYTE{buf%+j%}<>BYTE{x%+j%}
  6394.             out("Addresse:"+@dec_hex_val$(x%+j%,9)+"  Wert: "+@dec_hex_val$(BYTE{x%+j%},3)+"  Soll:"+@dec_hex_val$(w%,3))
  6395.           ENDIF
  6396.         NEXT j%
  6397.       ENDIF
  6398.     ENDIF
  6399.     '
  6400.   UNTIL abb%
  6401.   IF abb%>0
  6402.     out("Abgebrochen.")
  6403.   ENDIF
  6404.   out_do
  6405.   lend(1)
  6406.   '
  6407. RETURN
  6408. ' ---------------------- Lesen-Schreiben -----------------------
  6409. FUNCTION rwabs(mode%,buf%,cnt%,lgs%,drive%)
  6410.   IF lgs%<&HFFFF
  6411.     RETURN BIOS(4,mode%,L:buf%,cnt%,lgs%,drive%)
  6412.   ELSE
  6413.     RETURN BIOS(4,mode%,L:buf%,cnt%,-1,drive%,L:lgs%)
  6414.   ENDIF
  6415. ENDFUNC
  6416. PROCEDURE lesen
  6417.   .| Glob. Var.: ch%,mode%,d.isk%,drive%,disk_defekt%,status%,buf%,sektor%
  6418.   .|     track%,seite%,lgs%,f.ile%,h.ard%,block%,r.am%,f.dc%
  6419.   .| Felder    : whdl&()
  6420.   .| Ruft auf  : mdisk,info,err_inf,file_read,hard_read_sec,ram_read,do_seek
  6421.   .|     gap,set_slide,set_crcbuf
  6422.   .| Aufruf in : clr_part-1,last_11-1,hard_save-1,hard_bad-1,do_mark_bad-1
  6423.   .|     last_7-1,fdc_side-1,fdc_drive-1,fdc_trkread-1,fdc_trkwrite-1
  6424.   .|     fdc_head-1,ram_adress_read-1,ram_test-1,sektor_read-1
  6425.   .|     sektor_cluster-1,sektor_physik_do-1,sektor_compare-1,wind_dklick-1
  6426.   .|     wind_hslide-1,hpage_l-1,hpage_r-1,file_on-1,set_w-1,disc_info-4
  6427.   .|     disc_clear-1,disc_save-1,disc_check-1,last_5-4,last_10-1,datei_cut-4
  6428.   .|     do_file_open-1,do_datei_info-1,dir_secsearch-3,dir_fldren-1
  6429.   .|     dir_root-1,dir_sort-3,last_12-4,alt_q-1,top-1,lend-1,down-1,1_down-1
  6430.   .|     up-1,up_1-1,nxt_blk-1,test_max-1,address-1,fat_get_leiche-1
  6431.   .|     fat_xor-2,last_4-1,fat_read1-1,fat_read2-1,set_cursor_in_fat-1
  6432.   .|     cl_up-1,cl_down-1,test_suche-1,
  6433.   CLR ch%
  6434.   mdisk
  6435.   SELECT mode%
  6436.   CASE d.isk%
  6437.     IF drive%<2 AND disk_defekt%=1
  6438.       info
  6439.       status%=XBIOS(8,L:buf%,L:0,drive%,sektor%,track%,seite%,1)
  6440.     ELSE
  6441.       status%=@rwabs(0,buf%,1,lgs%,drive%)
  6442.     ENDIF
  6443.     err_inf(status%)
  6444.   CASE f.ile%
  6445.     file_read
  6446.   CASE h.ard%
  6447.     hard_read_sec(block%)
  6448.   CASE r.am%
  6449.     ram_read
  6450.   CASE f.dc%
  6451.     do_seek(track%)
  6452.     gap
  6453.   ENDSELECT
  6454.   set_slide(whdl&(0))
  6455.   set_crcbuf
  6456. RETURN
  6457. PROCEDURE set_crcbuf
  6458.   .| Glob. Var.: buf_crc%,utis%,buf%,l_end%,undo_buf%,buf_size%
  6459.   .| Aufruf in : scsicall-1,lesen-1,boot_sec-1,search_found-1,find_files-1,
  6460.   buf_crc%=C:utis%(&H400,L:buf%,L:l_end%,L:&HCDB4)
  6461.   BMOVE buf%,undo_buf%,buf_size%
  6462. RETURN
  6463. PROCEDURE change
  6464.   .| Glob. Var.: wind%,utis%,buf%,l_end%,buf_crc%,ch%
  6465.   .| Ruft auf  : alrt,schreiben
  6466.   .| Aufruf in : hard_read-1,sel_target_geraet-1,fdc_side-1,fdc_drive-1
  6467.   .|     fdc_trkread-1,ram_adress_read-1,sektor_read-1,sektor_cluster-1
  6468.   .|     ph_track-1,ph_sec-1,ph_side-1,haupt_dialog-2,wind_dklick-1
  6469.   .|     wind_hslide-1,hpage_l-1,hpage_r-1,disc_drive-1,file_close-1
  6470.   .|     datei_cut-1,dir_root-1,ctrl_f-1,ctrl_g-1,top-1,lend-1,down-1,up-1
  6471.   .|     address-1,exit-1,search_found-1,fat_bearbeiten-1,fat_read1-1
  6472.   .|     fat_read2-1,
  6473.   LOCAL a%
  6474.   IF wind%=0
  6475.     a%=C:utis%(&H400,L:buf%,L:l_end%,L:&HCDB4)
  6476.     IF a%<>buf_crc% AND ch%
  6477.       IF @alrt(2,"Sie haben Daten geändert!",0,"Schreiben|Abbruch")=1
  6478.         schreiben
  6479.       ELSE
  6480.         buf_crc%=a%
  6481.       ENDIF
  6482.     ELSE
  6483.       CLR ch%
  6484.     ENDIF
  6485.   ENDIF
  6486. RETURN
  6487. PROCEDURE schreiben
  6488.   .| Glob. Var.: ch%,mode%,d.isk%,drive%,status%,buf%,lgs%,f.ile%,h.ard%
  6489.   .|     block%,r.am%,f.dc%,fdrive%
  6490.   .| Ruft auf  : media,err_inf,file_write,scsicall,hard_err,ram_write
  6491.   .|     do_trk_write,info_line,do_cursor_anz
  6492.   .| Aufruf in : ram_adress_write-1,change-1,sektor_write-1,sec_write_sure-1
  6493.   .|     dat_sichern-1,disc_info-1,disc_load-1,last_12-2,
  6494.   CLR ch%
  6495.   '
  6496.   SELECT mode%
  6497.   CASE d.isk%
  6498.     IF @media(drive%)=0
  6499.       status%=@rwabs(1,buf%,1,lgs%,drive%)
  6500.       err_inf(status%)
  6501.     ELSE
  6502.       err_inf(-1)
  6503.     ENDIF
  6504.   CASE f.ile%
  6505.     file_write
  6506.   CASE h.ard%
  6507.     scsicall(10,block%,1,0,buf%,6,2)
  6508.     hard_err
  6509.   CASE r.am%
  6510.     ram_write
  6511.   CASE f.dc%
  6512.     IF @media(fdrive%)=0
  6513.       do_trk_write
  6514.     ELSE
  6515.       err_inf(-1)
  6516.     ENDIF
  6517.   ENDSELECT
  6518.   info_line
  6519.   do_cursor_anz(0)
  6520. RETURN
  6521. PROCEDURE do_undo
  6522.   .| Glob. Var.: wind%,ch%,old_p%,undo_buf%,buf%,buf_size%,mode%,f.dc%
  6523.   .|     undo_line$,l_eline%,txt_zeile%,top%,out%,l_end%,wz%
  6524.   .| Felder    : out$(),whdl&()
  6525.   .| Ruft auf  : anal_buf,do_list,set_slide
  6526.   .| Aufruf in : menu_mess-1,taste-1,cursor-1,
  6527.   LOCAL x%
  6528.   '
  6529.   IF wind%=0
  6530.     CLR ch%
  6531.     DEC old_p%
  6532.     BMOVE undo_buf%,buf%,buf_size%
  6533.     IF mode%=f.dc%
  6534.       anal_buf
  6535.     ENDIF
  6536.     do_list
  6537.   ELSE
  6538.     IF LEN(undo_line$)>0
  6539.       x%=l_eline%            !MAX(1,top%+txt_zeile%)
  6540.       IF ASC(undo_line$)=3
  6541.         INSERT out$(x%)=RIGHT$(undo_line$,LEN(undo_line$)-1)
  6542.       ELSE
  6543.         out$(x%)=undo_line$
  6544.         txt_zeile%=l_eline%-top%
  6545.       ENDIF
  6546.       CLR undo_line$,l_eline%
  6547.       IF x%<out%
  6548.         INC out%
  6549.         INC l_end%
  6550.       ELSE
  6551.         out%=x%
  6552.         l_end%=x%
  6553.       ENDIF
  6554.       IF top%+wz%+1>out%-1
  6555.         top%=out%-wz%
  6556.       ENDIF
  6557.       set_slide(whdl&(1))
  6558.       do_list
  6559.     ENDIF
  6560.   ENDIF
  6561. RETURN
  6562. ' ---------------------- Sektor Routinen -----------------------
  6563. PROCEDURE sektor_read
  6564.   .| Glob. Var.: a%,lgs%,el%,spd%
  6565.   .| Ruft auf  : change,eingabe,alrt,lesen,do_list
  6566.   .| Aufruf in : menu_mess-1,stat_line-1,
  6567.   change
  6568.   DO
  6569.     a%=@eingabe("Logische Sektornummer lesen:",lgs%)
  6570.     EXIT IF el%=0 OR a%>=0 AND a%<spd%
  6571.     ~@alrt(3,"Größte Sektornummer:|"+STR$(spd%-1),1,"Nochmal")
  6572.   LOOP
  6573.   IF el%<>0
  6574.     lgs%=a%
  6575.     lesen
  6576.     do_list
  6577.   ENDIF
  6578. RETURN
  6579. PROCEDURE sektor_write
  6580.   .| Glob. Var.: a%,lgs%,el%,spd%
  6581.   .| Ruft auf  : eingabe,alrt,schreiben
  6582.   .| Aufruf in : menu_mess-1,
  6583.   DO
  6584.     a%=@eingabe("Logische Sektornummer schreiben:",lgs%)
  6585.     EXIT IF el%=0 OR a%>=0 AND a%<spd%
  6586.     ~@alrt(3,"Größte Sektornummer:|"+STR$(spd%-1),1,"Nochmal")
  6587.   LOOP
  6588.   IF el%<>0
  6589.     lgs%=a%
  6590.     schreiben
  6591.   ENDIF
  6592. RETURN
  6593. PROCEDURE sektor_cluster
  6594.   .| Glob. Var.: a%,cluster%,el%,lgs%,spc%,anf_dat%,spd%,cpd%
  6595.   .| Ruft auf  : change,eingabe,alrt,lesen,do_list
  6596.   .| Aufruf in : stat_line-1,
  6597.   change
  6598.   DO
  6599.     a%=@eingabe("Cluster lesen:",cluster%)
  6600.     EXIT IF el%=0 OR a%=0 OR a%>=2 AND a%<cpd%+2
  6601.     ~@alrt(3,"Größte Clusternummer:|"+STR$(cpd%+1),1,"Nochmal")
  6602.   LOOP
  6603.   IF el%<>0
  6604.     IF a%=0  ! Pseudo-Clusternummer 0 wird erster Sektor des Wurzelverzeichnis
  6605.       lgs%=anf_dir%
  6606.     ELSE
  6607.       lgs%=(a%-2)*spc%+anf_dat%
  6608.     ENDIF
  6609.     lesen
  6610.     do_list
  6611.   ENDIF
  6612. RETURN
  6613. PROCEDURE ph_track
  6614.   .| Glob. Var.: drive%,a%,track%,el%,tpd%,trk%,sektor%,seite%
  6615.   .| Ruft auf  : change,eingabe,alrt,sektor_physik_do
  6616.   .| Aufruf in : stat_line-1,
  6617.   IF drive%<2
  6618.     change
  6619.     a%=@eingabe("Track:",track%)
  6620.     IF el%>0
  6621.       IF a%>tpd% OR a%<0
  6622.         ~@alrt(3,"Es gibt nur "+STR$(tpd%)+"|Spuren auf der Disk!",1,"Abbruch")
  6623.       ELSE
  6624.         trk%=a%
  6625.         sektor_physik_do(trk%,sektor%,seite%)
  6626.       ENDIF
  6627.     ENDIF
  6628.   ENDIF
  6629. RETURN
  6630. PROCEDURE ph_sec
  6631.   .| Glob. Var.: drive%,a%,sektor%,el%,spt%,sec%,track%,seite%
  6632.   .| Ruft auf  : change,eingabe,alrt,sektor_physik_do
  6633.   .| Aufruf in : stat_line-1,
  6634.   IF drive%<2
  6635.     change
  6636.     a%=@eingabe("Sektor:",sektor%)
  6637.     IF el%>0
  6638.       IF a%>spt% OR a%<1
  6639.         ~@alrt(3,"Es gibt nur "+STR$(spt%)+"|Sektoren pro Spur!",1,"Abbruch")
  6640.       ELSE
  6641.         sec%=a%
  6642.         sektor_physik_do(track%,sec%,seite%)
  6643.       ENDIF
  6644.     ENDIF
  6645.   ENDIF
  6646. RETURN
  6647. PROCEDURE ph_side
  6648.   .| Glob. Var.: drive%,sid%,sd%,seite%,track%,sektor%
  6649.   .| Ruft auf  : change,sektor_physik_do,do_list,alrt
  6650.   .| Aufruf in : stat_line-1,
  6651.   IF drive%<2
  6652.     IF sid%>1
  6653.       change
  6654.       sd%=1-seite%
  6655.       sektor_physik_do(track%,sektor%,sd%)
  6656.       do_list
  6657.     ELSE
  6658.       ~@alrt(3,"Diskette ist nur einseitig!",1,"Abbruch")
  6659.     ENDIF
  6660.   ENDIF
  6661. RETURN
  6662. PROCEDURE sektor_physik_do(trk%,sec%,sd%)
  6663.   .| Glob. Var.: sid%,lgs%,spt%,spd%
  6664.   .| Ruft auf  : alrt,lesen,do_list
  6665.   .| Aufruf in : ph_track-1,ph_sec-1,ph_side-1,
  6666.   IF sid%=2
  6667.     lgs%=(trk%*spt%*sid%)+sec%+sd%*spt%-1
  6668.   ELSE
  6669.     lgs%=trk%*spt%+sec%-1
  6670.   ENDIF
  6671.   IF lgs%>=spd%
  6672.     ~@alrt(3,"Größte Sektornummer:|"+STR$(spd%-1),1,"Abbruch")
  6673.     CLR lgs%
  6674.   ENDIF
  6675.   lesen
  6676.   do_list
  6677. RETURN
  6678. PROCEDURE sec_write_sure(a%)
  6679.   .| Glob. Var.: wa$,lgs%
  6680.   .| Ruft auf  : alrt,schreiben (tot)
  6681.   IF @alrt(2,"Sektor "+STR$(a%)+" schreiben?",0,wa$)=1
  6682.     lgs%=a%
  6683.     schreiben
  6684.   ENDIF
  6685. RETURN
  6686. PROCEDURE sektor_compare
  6687.   .| Glob. Var.: c.ompare%,ex_obj&,compok&,drive%,drv_map%,comps1&,start1%
  6688.   .|     comps2&,comps5&,start2%,comps6&,comps3&,status%,sec%,bps%,spd%
  6689.   .|     comps4&
  6690.   .| Ruft auf  : box_draw,form_do,box_undraw,clr_state,dsetdrv,get_char$
  6691.   .|     get_val,boot_sec,alrt,do_sektor_compare,lesen,do_list
  6692.   .| Aufruf in : menu_mess-1,
  6693.   LOCAL a%,b%,c%,count%,dr1%,dr2%,old_drive%,a$
  6694.   '
  6695.   box_draw(c.ompare%)
  6696.   ex_obj&=@form_do(c.ompare%) AND &HFF
  6697.   box_undraw(c.ompare%)
  6698.   clr_state(c.ompare%,ex_obj&,1)
  6699.   '
  6700.   WHILE ex_obj&=compok&
  6701.     old_drive%=drive%
  6702.     drv_map%=@dsetdrv(drive%)   ! BIOS(10)
  6703.     '
  6704.     dr1%=ASC(@get_char$(c.ompare%,comps1&))-65
  6705.     start1%=@get_val(c.ompare%,comps2&)
  6706.     EXIT IF (drv_map% AND 2^dr1%)=0
  6707.     '
  6708.     dr2%=ASC(@get_char$(c.ompare%,comps5&))-65
  6709.     start2%=@get_val(c.ompare%,comps6&)
  6710.     EXIT IF (drv_map% AND 2^dr2%)=0
  6711.     '
  6712.     count%=@get_val(c.ompare%,comps3&)
  6713.     drive%=dr1%
  6714.     boot_sec
  6715.     EXIT IF status%<>0
  6716.     sec%=bps%
  6717.     c%=spd%
  6718.     '
  6719.     drive%=dr2%
  6720.     boot_sec
  6721.     EXIT IF status%<>0
  6722.     b%=bps%
  6723.     '
  6724.     IF OB_STATE(c.ompare%,comps4&)>0
  6725.       CLR start1%
  6726.       CLR start2%
  6727.       count%=MAX(spd%,c%)
  6728.     ELSE
  6729.       count%=MIN(count%,c%-start1%)
  6730.       count%=MIN(count%,spd%-start2%)
  6731.     ENDIF
  6732.     IF b%<>sec%
  6733.       ~@alrt(3,"Sektoren sind unterschiedlich groß.",1,"Abbruch")
  6734.     ENDIF
  6735.     EXIT IF b%<>sec%
  6736.     '
  6737.     ~@do_sektor_compare(dr1%,dr2%,start1%,start2%,count%,sec%)
  6738.     '
  6739.     drive%=old_drive%
  6740.     boot_sec
  6741.     lesen
  6742.     do_list
  6743.     EXIT IF 1
  6744.   WEND
  6745. RETURN
  6746. FUNCTION do_sektor_compare(dr1%,dr2%,start1%,start2%,count%,sec%)
  6747.   .| Glob. Var.: fehler%,cmp_ram%,cmp1%,a$,b.ox%,boxtxt&,boxaktiv&,n$,status%
  6748.   .|     erg2%,wa$,utis%,bps%,fer%,max_err%
  6749.   .| Felder    : err_fld$()
  6750.   .| Ruft auf  : put_char,box_draw,objc_update,was_ist,alrt,box_undraw
  6751.   .| Aufruf in : sektor_compare-1,
  6752.   LOCAL b%,cmp%,anz%,off%,total%
  6753.   '
  6754.   fehler%=MALLOC(-1)
  6755.   cmp%=(fehler%-10000)/(sec%*2)
  6756.   cmp%=MIN(count%,cmp%)
  6757.   cmp_ram%=MALLOC(cmp%*sec%)
  6758.   '
  6759.   anz%=cmp%
  6760.   total%=count%
  6761.   cmp1%=cmp_ram%+cmp%*sec%
  6762.   '
  6763.   a$="Vergleich "+CHR$(dr1%+65)+": - "+CHR$(dr2%+65)+":"
  6764.   put_char(b.ox%,boxtxt&,a$)
  6765.   put_char(b.ox%,boxaktiv&," ")
  6766.   box_draw(b.ox%)
  6767.   '
  6768.   DO
  6769.     a$="noch zu vergleichen: "+RIGHT$(n$+STR$(total%),7)
  6770.     put_char(b.ox%,boxaktiv&,a$)
  6771.     objc_update(b.ox%,boxaktiv&)
  6772.     '
  6773.     EXIT IF @was_ist>0
  6774.     status%=@rwabs(2,cmp_ram%,cmp%,start1%,dr1%)
  6775.     '
  6776.     EXIT IF @was_ist>0
  6777.     '
  6778.     erg2%=1
  6779.     IF dr1%=dr2% AND dr1%<2 AND dr2%<2
  6780.       ~@alrt(2,"Diskette gewechselt?",1,wa$)
  6781.     ENDIF
  6782.     EXIT IF erg2%=2
  6783.     '
  6784.     status%=@rwabs(2,cmp1%,cmp%,start2%,dr2%)
  6785.     '
  6786.     anz%=cmp%*sec%              ! Anzahl der Bytes zu vergleichen
  6787.     CLR off%
  6788.     IF C:utis%(&H500,L:cmp_ram%,L:cmp1%,L:anz%/4-1)<>0
  6789.       DO
  6790.         b%=off%*sec%
  6791.         IF C:utis%(&H500,L:cmp_ram%+b%,L:cmp1%+b%,L:bps%/4-1)<>0
  6792.           IF fer%<max_err%
  6793.             INC fer%
  6794.             err_fld$(fer%)="Sektor:"+STR$(start1%+off%)+" verschieden"
  6795.           ENDIF
  6796.         ENDIF
  6797.         INC off%
  6798.         EXIT IF off%=cmp% OR fer%>=max_err%
  6799.       LOOP
  6800.     ENDIF
  6801.     EXIT IF fer%=max_err%
  6802.     ADD start1%,cmp%
  6803.     ADD start2%,cmp%
  6804.     SUB total%,cmp%
  6805.     EXIT IF total%<=0
  6806.     cmp%=MIN(cmp%,total%)
  6807.   LOOP
  6808.   box_undraw(b.ox%)
  6809.   IF fer%=max_err%
  6810.     ~@alrt(3,"Fehlerüberlauf!",1,"Abbruch")
  6811.   ENDIF
  6812.   ~MFREE(cmp_ram%)
  6813.   RETURN 0
  6814. ENDFUNC
  6815. ' ---------------------------------------------------------
  6816. PROCEDURE set_button(a&)        ! einen kleinen Button setzen
  6817.   .| Glob. Var.: k1&,k14&,desk.top%
  6818.   .| Ruft auf  : clr_button,set_state,redraw_desk
  6819.   .| Aufruf in : haupt_dialog-1,
  6820.   LOCAL i&
  6821.   FOR i&=k1& TO k14&
  6822.     clr_button(i&)
  6823.   NEXT i&
  6824.   set_state(desk.top%,a&,1)
  6825.   redraw_desk(a&)
  6826. RETURN
  6827. PROCEDURE clr_button(a&)        ! einen Desktop-Button testen und deselected
  6828.   .| Glob. Var.: desk.top%
  6829.   .| Ruft auf  : clr_state,redraw_desk
  6830.   .| Aufruf in : set_button-1,set_mod_button-1,haupt_dialog-1,
  6831.   IF (OB_STATE(desk.top%,a&) AND 1)<>0
  6832.     clr_state(desk.top%,a&,1)
  6833.     redraw_desk(a&)
  6834.   ENDIF
  6835. RETURN
  6836. PROCEDURE set_mod_button(a&)    ! einen DESKTOP Modus setzen
  6837.   .| Glob. Var.: mod1&,mod6&,desk.top%
  6838.   .| Ruft auf  : clr_button,set_state,redraw_desk
  6839.   .| Aufruf in : menu_1-1,menu_2-1,menu_3-1,menu_4-1,menu_5-1,
  6840.   LOCAL i&
  6841.   FOR i&=mod1& TO mod6&
  6842.     clr_button(i&)
  6843.   NEXT i&
  6844.   set_state(desk.top%,a&,1)
  6845.   redraw_desk(a&)
  6846. RETURN
  6847. PROCEDURE do_cursor_anz(nr%)
  6848.   .| Glob. Var.: old_cpos%
  6849.   .| Ruft auf  : cursor_anz
  6850.   .| Aufruf in : base_look-1,schreiben-1,wind_mess-2,desktop_back-1
  6851.   .|     set_last-1,file_write-1,cursor-1,dec_hex-1,edit_ascii-2,exit-1,
  6852.   DEC old_cpos%
  6853.   cursor_anz(nr%)
  6854. RETURN
  6855. PROCEDURE cursor_anz(nr%)
  6856.   .| Glob. Var.: dum%,z%,tz%,buf%,old_cpos%,old_p%,fp%,n$,ch%,top%,txt_zeile%
  6857.   .|     txt_spalte%,txt_links%,last%,ch2%
  6858.   .| Felder    : whdl&(),wi%()
  6859.   .| Ruft auf  : dec_hex_val$,do_cursor
  6860.   .| Aufruf in : do_cursor_anz-1,message_auswerten-2,wind_slide-1
  6861.   .|     redraw_list-1,
  6862.   LOCAL a%,b%,wa%,a$,mx%,my%,mb%,mk%
  6863.   ~WIND_GET(0,10,a%,dum%,dum%,dum%)
  6864.   IF a%=whdl&(0) OR a%=whdl&(1)
  6865.     IF nr%=0
  6866.       a%=z%+tz%
  6867.       b%=BYTE{a%+buf%}
  6868.       IF (a%<>old_cpos% OR b%<>old_p%)
  6869.         ~GRAF_MKSTATE(mx%,my%,mb%,mk%)
  6870.         IF mb%=0 OR (mx%<=wi%(0,1)+wi%(0,3) AND my%<=wi%(0,2)+wi%(0,4))
  6871.           old_cpos%=a%
  6872.           old_p%=b%
  6873.           a$=@dec_hex_val$(a%+fp%,6)+" $"+HEX$(b%,2)+" "+RIGHT$(n$+STR$(b%),3)+" %"+BIN$(b%,8)
  6874.           do_cursor(nr%,a$,ch%)
  6875.         ENDIF
  6876.       ENDIF
  6877.     ELSE
  6878.       a$="Zeile:"+RIGHT$("0000"+STR$(top%+txt_zeile%),4)+" Spalte:"+RIGHT$("000"+STR$(txt_spalte%+txt_links%),3)
  6879.       IF last%>0
  6880.         a$=a$+" !"
  6881.       ENDIF
  6882.       do_cursor(nr%,a$,ch2%)
  6883.     ENDIF
  6884.   ENDIF
  6885. RETURN
  6886. PROCEDURE do_cursor(nr%,a$,a%)
  6887.   .| Felder    : w_titel%(),whdl&()
  6888.   .| Aufruf in : cursor_anz-2,
  6889.   IF a%>0
  6890.     a$="* "+a$
  6891.   ELSE
  6892.     a$="  "+a$
  6893.   ENDIF
  6894.   a$=LEFT$(a$,38)+CHR$(0)+CHR$(0)
  6895.   BMOVE V:a$,w_titel%(nr%),LEN(a$)
  6896.   ~WIND_SET(whdl&(nr%),2,CARD(SWAP(w_titel%(nr%))),CARD(w_titel%(nr%)),0,0)
  6897. RETURN
  6898. PROCEDURE lern_ende(m_titel&,m_eintrag&)
  6899.   .| Glob. Var.: lern%,kli%,ml%,menu_pointer%,last%
  6900.   .| Felder    : frei%()
  6901.   .| Ruft auf  : info_kleine_buttons,mnorm
  6902.   .| Aufruf in : message_auswerten-1,
  6903.   CLR lern%
  6904.   frei%(kli%,0)=ml%
  6905.   frei%(kli%,1)=m_eintrag&
  6906.   frei%(kli%,2)=m_titel&
  6907.   ~MENU_TNORMAL(menu_pointer%,m_titel&,1)
  6908.   IF last%=8
  6909.     info_kleine_buttons
  6910.   ENDIF
  6911.   mnorm
  6912. RETURN
  6913. PROCEDURE set_kleine_buttons
  6914.   .| Glob. Var.: menu_pointer%,k.leinst%,kleintxt&,inf_ma$,kli%,klein1&
  6915.   .|     klein2&,ex_obj&,desk.top%,k1&,lernen&,lern%
  6916.   .| Felder    : frei%()
  6917.   .| Ruft auf  : put_char,menu_1,menu_2,menu_3,menu_4,menu_5,get_char$
  6918.   .|     box_draw,form_do,clr_state,redraw_desk,mhand,box_undraw
  6919.   .| Aufruf in : haupt_dialog-1,last_8-1,
  6920.   LOCAL a%,b%,a$,b$
  6921.   '
  6922.   ~MENU_TNORMAL(menu_pointer%,7,1)
  6923.   put_char(k.leinst%,kleintxt&,MID$(inf_ma$,kli%*5-4,5))
  6924.   ON frei%(kli%,0) GOSUB menu_1,menu_2,menu_3,menu_4,menu_5
  6925.   a%=frei%(kli%,2)
  6926.   b%=OB_SPEC(menu_pointer%,a%)
  6927.   IF b%>0
  6928.     a$=@get_char$(menu_pointer%,a%)
  6929.   ELSE
  6930.     a$="  "
  6931.   ENDIF
  6932.   CHAR{{OB_SPEC(k.leinst%,klein1&)}}=a$
  6933.   a%=frei%(kli%,1)
  6934.   b%=OB_SPEC(menu_pointer%,a%)
  6935.   IF b%>0
  6936.     a$=@get_char$(menu_pointer%,a%)
  6937.   ELSE
  6938.     a$=" "
  6939.   ENDIF
  6940.   IF a$="" OR LEN(a$)<2
  6941.     a$="  "
  6942.   ENDIF
  6943.   put_char(k.leinst%,klein2&,RIGHT$(a$,LEN(a$)-1))
  6944.   '
  6945.   box_draw(k.leinst%)
  6946.   ex_obj&=@form_do(k.leinst%) AND &HFF
  6947.   clr_state(k.leinst%,ex_obj&,1)
  6948.   '
  6949.   a$=@get_char$(k.leinst%,kleintxt&)
  6950.   b$=LEFT$(a$+STRING$(5,0),5)
  6951.   MID$(inf_ma$,kli%*5-4,5)=b$
  6952.   put_char(desk.top%,k1&+kli%-1,a$)
  6953.   redraw_desk(0)
  6954.   '
  6955.   IF ex_obj&=lernen&
  6956.     lern%=1
  6957.     mhand
  6958.   ENDIF
  6959.   box_undraw(k.leinst%)
  6960. RETURN
  6961. PROCEDURE set_block             ! Block markieren DATENfenster
  6962.   .| Glob. Var.: buf_beg%,tz%,z%,old%,xt%,ox%,obuf%,last_line%,yt%,nx%
  6963.   .|     buf_end%,utis%,ak%,l_end%,wz%,wzb%,desk.top%,z.hoehe%
  6964.   .| Felder    : wi%(),l_end%(),whdl&()
  6965.   .| Ruft auf  : maus_pos,ctrl_h,zeile,scrollup,scrolldown,menu_blkhide
  6966.   .|     set_stat,do_list,set_slide
  6967.   .| Aufruf in : message_auswerten-1,
  6968.   LOCAL i%,mx%,my%,mb%,mk%,otz%,xtz%,tzeit%,zg%
  6969.   '
  6970.   ~GRAF_MKSTATE(mx%,my%,mb%,mk%)
  6971.   maus_pos(mx%,my%)
  6972.   zg%=buf_beg%      ! zum demarkieren
  6973.   otz%=tz%+z%
  6974.   old%=xt%          ! zum Block demarkieren
  6975.   ox%=otz%          ! jeweils die letzte Position
  6976.   buf_beg%=otz%     ! Start
  6977.   obuf%=buf_beg%    ! zum Block demarkieren
  6978.   last_line%=yt%    ! aktuelle Zeile
  6979.   '
  6980.   tzeit%=TIMER
  6981.   WHILE mb%
  6982.     maus_pos(mx%,my%)
  6983.     nx%=tz%+z%
  6984.     '
  6985.     IF tz%+z%=obuf% AND xt%=old%
  6986.       ctrl_h
  6987.     ELSE
  6988.       '
  6989.       IF ox%<>nx%
  6990.         IF nx%>otz%           ! Block vorwärts oder rückwärts markieren?
  6991.           buf_beg%=otz%       ! vor...
  6992.           buf_end%=tz%+z%
  6993.         ELSE
  6994.           buf_end%=otz%
  6995.           buf_beg%=tz%+z%
  6996.         ENDIF
  6997.         ~C:utis%(&H300,L:ak%,L:l_end%-1)
  6998.         ~C:utis%(&H301,L:ak%+buf_beg%,L:MAX(0,buf_end%-buf_beg%))
  6999.         ~GRAF_MOUSE(256,0)
  7000.         IF yt%>last_line%
  7001.           FOR i%=MAX(0,last_line%-1) TO MIN(wz%-1,yt%+1)
  7002.             zeile(i%)
  7003.           NEXT i%
  7004.         ELSE
  7005.           FOR i%=MIN(wz%-1,last_line%+1) DOWNTO MAX(0,yt%-1)
  7006.             zeile(i%)
  7007.           NEXT i%
  7008.         ENDIF
  7009.         ~GRAF_MOUSE(257,0)
  7010.         last_line%=yt%
  7011.         ox%=nx%
  7012.       ENDIF
  7013.       '
  7014.     ENDIF
  7015.     IF my%>wi%(0,4)+wi%(0,2) AND z%<l_end%(0)-wzb%
  7016.       scrollup(0)
  7017.       ~EVNT_TIMER(70)
  7018.     ENDIF
  7019.     IF my%<wi%(0,2)+OB_H(desk.top%,0)+z.hoehe% AND z%>0
  7020.       scrolldown(0)
  7021.       ~EVNT_TIMER(70)
  7022.     ENDIF
  7023.     '
  7024.     ~GRAF_MKSTATE(mx%,my%,mb%,mk%)
  7025.   WEND
  7026.   IF TIMER-tzeit%<1
  7027.     buf_beg%=zg%
  7028.   ENDIF
  7029.   IF buf_end%>=buf_beg%
  7030.     menu_blkhide(1)
  7031.   ELSE
  7032.     menu_blkhide(0)
  7033.   ENDIF
  7034.   set_stat
  7035.   do_list
  7036.   set_slide(whdl&(0))
  7037. RETURN
  7038. PROCEDURE txt_block             ! Block markieren TEXT...
  7039.   .| Glob. Var.: last%,mx%,my%,mb%,mk%,tbuf_beg%,txt_zeile%,top%,txt_spalte%
  7040.   .|     tbuf_end%,last_line%,out%,z.hoehe%,txt_blkon%
  7041.   .| Felder    : wz%(),wi%(),whdl&()
  7042.   .| Ruft auf  : maus_pos,set_var_txt,text_line,scrollup,scrolldown,do_list
  7043.   .|     set_stat,set_slide
  7044.   .| Aufruf in : message_auswerten-1,
  7045.   LOCAL i%,otz%,opos%,npos%,tzeit%
  7046.   '
  7047.   IF last%=0
  7048.     ~GRAF_MKSTATE(mx%,my%,mb%,mk%)
  7049.     maus_pos(mx%,my%)
  7050.     tbuf_beg%=(txt_zeile%+top%)*255+txt_spalte%
  7051.     otz%=tbuf_beg%
  7052.     tbuf_end%=tbuf_beg%
  7053.     last_line%=txt_zeile%
  7054.     set_var_txt
  7055.     tzeit%=TIMER
  7056.     '
  7057.     WHILE mb%
  7058.       maus_pos(mx%,my%)
  7059.       npos%=(txt_zeile%+top%)*255+txt_spalte%
  7060.       '
  7061.       IF opos%<>npos%     ! hat sich was getan?
  7062.         IF npos%>otz%     ! ja, Block vorwärts oder rückwärts markieren?
  7063.           tbuf_beg%=otz%
  7064.           tbuf_end%=npos%
  7065.         ELSE
  7066.           tbuf_end%=otz%
  7067.           tbuf_beg%=npos%
  7068.         ENDIF
  7069.         set_var_txt
  7070.         ~GRAF_MOUSE(256,0)
  7071.         IF txt_zeile%>last_line%
  7072.           FOR i%=MAX(1,last_line%-1) TO MIN(wz%(1),txt_zeile%+1)
  7073.             text_line(top%+i%)
  7074.           NEXT i%
  7075.         ELSE
  7076.           FOR i%=MIN(wz%(1),last_line%+1) DOWNTO MAX(1,txt_zeile%-1)
  7077.             text_line(top%+i%)
  7078.           NEXT i%
  7079.         ENDIF
  7080.         ~GRAF_MOUSE(257,0)
  7081.         last_line%=txt_zeile%
  7082.         opos%=npos%
  7083.       ENDIF
  7084.       IF my%>wi%(1,4)+wi%(1,2) AND txt_zeile%+top%<out%
  7085.         scrollup(1)
  7086.       ENDIF
  7087.       IF my%<wi%(1,2)+z.hoehe% AND txt_zeile%+top%>0
  7088.         scrolldown(1)
  7089.         do_list
  7090.       ENDIF
  7091.       ~GRAF_MKSTATE(mx%,my%,mb%,mk%)
  7092.     WEND
  7093.     txt_blkon%=1
  7094.     IF TIMER-tzeit%<1
  7095.       CLR tbuf_beg%,tbuf_end%
  7096.       txt_blkon%=0
  7097.     ENDIF
  7098.     set_stat
  7099.     do_list
  7100.     set_slide(whdl&(1))
  7101.   ENDIF
  7102. RETURN
  7103. PROCEDURE set_var_txt           ! Blockgrenzen setzen im Textfenster
  7104.   .| Glob. Var.: tblkaz%,tbuf_beg%,tblkas%,tblkez%,tbuf_end%,tblkes%
  7105.   .| Aufruf in : txt_block-2,ctrl_h-1,set_stat-1,set_found_block-1,
  7106.   tblkaz%=tbuf_beg%/255
  7107.   tblkas%=tbuf_beg%-INT(tbuf_beg%/255)*255
  7108.   tblkez%=tbuf_end%/255
  7109.   tblkes%=tbuf_end%-INT(tbuf_end%/255)*255-1
  7110. RETURN
  7111. PROCEDURE coff                  ! Cursor aus
  7112.   .| Glob. Var.: cvisible%
  7113.   .| Ruft auf  : blit_cursor
  7114.   .| Aufruf in : message_auswerten-2,haupt_dialog-1,wind_dklick-1,menu_mess-1
  7115.   .|     wind_mess-1,wind_top-1,to_blk_anf-1,to_blk_end-1,taste-1,cursor-1
  7116.   .|     edit_ex-1,scrollup-2,scrolldown-2,search-1,
  7117.   IF cvisible%>0
  7118.     blit_cursor
  7119.   ENDIF
  7120. RETURN
  7121. PROCEDURE blit_cursor           ! Cursor zeichnen
  7122.   .| Glob. Var.: dum%,wind%,z.hoehe%,cvisible%,hex!,xt%,beg_ascii%,z.breite%
  7123.   .|     yt%,txt_spalte%,txt_zeile%
  7124.   .| Felder    : whdl&(),wi%(),ty%(),par%(),scr%()
  7125.   .| Ruft auf  : out_lined_cursor
  7126.   .| Aufruf in : coff-1,message_auswerten-3,cursor-1,edit_ascii-1,
  7127.   LOCAL a%,cx%,cy%,x%,y%,b%
  7128.   '
  7129.   ~WIND_UPDATE(1)
  7130.   ~WIND_GET(0,10,a%,dum%,dum%,dum%)
  7131.   IF a%=whdl&(0) OR a%=whdl&(1)         ! eins meiner Fenster oben?
  7132.     ~GRAF_MOUSE(256,0)
  7133.     cx%=((wi%(wind%,1)+1+7) DIV 8)*8    ! x-Ausgabe
  7134.     cy%=ty%(wind%)-z.hoehe%             ! y-  "
  7135.     cvisible%=1-cvisible%               ! An dieser Variable ist zu sehen, ob
  7136.     '                                   ! vor dem Bewegen des Cursors der Cursor
  7137.     '                                   ! noch geloescht werden muss.
  7138.     IF wind%=0
  7139.       IF hex!=FALSE
  7140.         x%=cx%+(xt%-beg_ascii%+3)*3*z.breite%
  7141.         y%=cy%+yt%*z.hoehe%
  7142.         b%=2*z.breite%
  7143.       ELSE
  7144.         x%=cx%+(INT(xt%/3)+9+beg_ascii%)*z.breite%
  7145.         y%=cy%+yt%*z.hoehe%
  7146.         b%=z.breite%
  7147.       ENDIF
  7148.       out_lined_cursor(x%-1,y%+1,b%+1,z.hoehe%) ! Cursor im ASCII-Feld
  7149.       par%(0)=cx%+(xt%+9)*z.breite%     ! x-Pos
  7150.       par%(1)=cy%+yt%*z.hoehe%+1        ! y-Pos
  7151.       par%(2)=par%(0)+z.breite%-1       ! Breite
  7152.       par%(3)=par%(1)+z.hoehe%-1        ! Hoehe
  7153.       par%(4)=par%(0)
  7154.       par%(5)=par%(1)
  7155.       par%(6)=par%(2)
  7156.       par%(7)=par%(3)
  7157.       par%(8)=10
  7158.       CLIP wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4)
  7159.       BITBLT scr%(),scr%(),par%()
  7160.       CLIP OFF
  7161.     ELSE
  7162.       x%=cx%+(txt_spalte%-1)*z.breite%
  7163.       y%=cy%+txt_zeile%*z.hoehe%+1
  7164.       out_lined_cursor(x%,y%-1,1,z.hoehe%+2)         ! Cursor im Textfenster
  7165.     ENDIF
  7166.     ~GRAF_MOUSE(257,0)
  7167.   ENDIF
  7168.   ~WIND_UPDATE(0)
  7169. RETURN
  7170. PROCEDURE out_lined_cursor(x%,y%,b%,h%)
  7171.   .| Glob. Var.: scr_handle%,wind%
  7172.   .| Felder    : wi%()
  7173.   .| Ruft auf  : vs_clip,vswr_mode,v_line
  7174.   .| Aufruf in : blit_cursor-2,
  7175.   LOCAL x1%,x2%
  7176.   x1%=x%+b%
  7177.   x2%=y%+h%-1
  7178.   vs_clip(scr_handle%,1,wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4))
  7179.   vswr_mode(scr_handle%,3)
  7180.   v_line(scr_handle%,x%,y%,x1%,y%)
  7181.   v_line(scr_handle%,x%,y%,x%,x2%)
  7182.   v_line(scr_handle%,x%,x2%,x1%,x2%)
  7183.   v_line(scr_handle%,x1%,y%,x1%,x2%)
  7184.   vswr_mode(scr_handle%,1)
  7185.   vs_clip(scr_handle%,0,0,0,0,0)
  7186. RETURN
  7187. ' ----------------------------------------------------------
  7188. PROCEDURE endless_loop
  7189.   .| Ruft auf  : little_event_multi
  7190.   .| Aufruf in : HAUPTPROGRAMM-1,
  7191.   DO
  7192.     little_event_multi
  7193.   LOOP
  7194. RETURN
  7195. PROCEDURE little_event_multi
  7196.   .| Glob. Var.: cursor_rate%,user_code%,user_control%,mes&,mes_adr%,ev_mx&
  7197.   .|     ev_my&,ev_mb&,ev_ks&,ev_key&,ev_clicks&
  7198.   .| Ruft auf  : do_exit,message_auswerten
  7199.   .| Aufruf in : endless_loop-1,
  7200.   LOCAL acr%
  7201.   REPEAT
  7202.     acr%=cursor_rate%
  7203.     IF acr%=0
  7204.       acr%=500
  7205.     ENDIF
  7206.     '
  7207.     IF user_code%>=0
  7208.       INC user_control%
  7209.       IF user_control%>100
  7210.         do_exit
  7211.       ENDIF
  7212.     ENDIF
  7213.     '
  7214.     mes&=EVNT_MULTI(&X111111,2,1,1,0,0,0,0,0,0,0,0,0,0,mes_adr%,acr%,ev_mx&,ev_my&,ev_mb&,ev_ks&,ev_key&,ev_clicks&)
  7215.     '
  7216.   UNTIL (mes& AND &X110011)
  7217.   message_auswerten(mes&)
  7218. RETURN
  7219. PROCEDURE message_auswerten(mes&)
  7220.   .| Glob. Var.: repflag%,ev_key&,ev_ks&,wind_top%,dum%,y1%,desk.top%,ground&
  7221.   .|     y2%,z.hoehe%,ev_mx&,ev_my&,ev_clicks&,z.breite%,mes_adr%,lern%
  7222.   .|     cursor_rate%,cvisible%
  7223.   .| Felder    : whdl&()
  7224.   .| Ruft auf  : taste,wind_aktpar,haupt_dialog,stat_line,address,coff
  7225.   .|     maus_pos,set_block,cursor_anz,blit_cursor,wind_dklick,txt_block
  7226.   .|     lern_ende,menu_mess,mnorm,wind_mess
  7227.   .| Aufruf in : little_event_multi-1,
  7228.   LOCAL wmx%,wmy%,wmb%,wmh%,mess1%,mess2%,mess3%,mess4%,mess5%
  7229.   '
  7230.   IF BTST(mes&,0)=TRUE
  7231.     repflag%=PEEK(&H484)
  7232.     SPOKE &H484,repflag% AND 253
  7233.     taste(ev_key&,ev_ks&)       ! Tastatur
  7234.     SPOKE &H484,repflag%
  7235.   ENDIF
  7236.   '
  7237.   IF BTST(mes&,1)=TRUE
  7238.     ~WIND_GET(0,10,wind_top%,dum%,dum%,dum%)
  7239.     IF wind_top%=whdl&(0) OR wind_top%=whdl&(1) ! geht mich was an?
  7240.       ~WIND_GET(wind_top%,4,wmx%,wmy%,wmb%,wmh%) ! ja, Koordinaten holen
  7241.       wind_aktpar(whdl&(wind_top%))
  7242.       IF wind_top%=whdl&(0)
  7243.         '
  7244.         y1%=wmy%+OB_H(desk.top%,ground&)
  7245.         y2%=y1%+z.hoehe%
  7246.         IF ev_mx&>wmx% AND ev_mx&<wmx%+wmb%   ! x-Bereich checken
  7247.           IF ev_my&>wmy% AND ev_my&<y1%       ! Buttons?
  7248.             haupt_dialog
  7249.           ELSE
  7250.             IF ev_my&>y1% AND ev_my&<y2%
  7251.               stat_line(whdl&(0))             ! Statuszeile?
  7252.             ELSE
  7253.               IF ev_my&>y2% AND ev_my&<wmy%+wmh% ! sonst im Fenster
  7254.                 '
  7255.                 IF ev_clicks&=1               ! Doppelklick?
  7256.                   IF ev_mx&<wmx%+8*z.breite%
  7257.                     address                   ! im Addressteil?
  7258.                   ELSE
  7259.                     coff
  7260.                     maus_pos(ev_mx&,ev_my&)
  7261.                     set_block                 ! Lasso?
  7262.                     cursor_anz(0)
  7263.                     blit_cursor
  7264.                   ENDIF
  7265.                 ELSE
  7266.                   wind_dklick                 ! Doppelklick
  7267.                 ENDIF
  7268.               ENDIF
  7269.             ENDIF
  7270.           ENDIF
  7271.         ENDIF
  7272.       ELSE
  7273.         IF wind_top%=whdl&(1)
  7274.           IF ev_mx&>wmx% AND ev_mx&<wmx%+wmb%
  7275.             IF ev_my&>wmy% AND ev_my&<wmy%+z.hoehe%
  7276.               stat_line(whdl&(1))                       ! in Statuszeile?
  7277.             ELSE
  7278.               IF ev_my&>wmy% AND ev_my&<wmy%+wmh%       ! sonst innerhalb
  7279.                 coff
  7280.                 maus_pos(ev_mx&,ev_my&)
  7281.                 txt_block
  7282.                 cursor_anz(1)
  7283.                 blit_cursor
  7284.               ENDIF
  7285.             ENDIF
  7286.           ENDIF
  7287.         ENDIF
  7288.       ENDIF
  7289.     ENDIF
  7290.   ENDIF
  7291.   '
  7292.   IF BTST(mes&,4)=TRUE
  7293.     mess1%=CARD{mes_adr%+6}
  7294.     mess2%=CARD{mes_adr%+8}
  7295.     mess3%=CARD{mes_adr%+10}
  7296.     mess4%=CARD{mes_adr%+12}
  7297.     mess5%=CARD{mes_adr%+14}
  7298.     wind_aktpar(whdl&(mess1%))
  7299.     IF CARD{mes_adr%}=10       ! Mitteilung - MENU
  7300.       IF lern%>0
  7301.         lern_ende(mess1%,mess2%)
  7302.       ELSE
  7303.         menu_mess(mess1%,mess2%)
  7304.         mnorm  ! Maus wieder auf Pfeil zurückstellen
  7305.       ENDIF
  7306.     ELSE                        !            - Window
  7307.       ~WIND_GET(0,10,wind_top%,dum%,dum%,dum%)
  7308.       wind_mess(CARD{mes_adr%},mess1%,mess2%,mess3%,mess4%,mess5%)
  7309.     ENDIF
  7310.   ENDIF
  7311.   '
  7312.   IF BTST(mes&,5)=TRUE          ! Timer
  7313.     IF cursor_rate%>0 OR cvisible%=0
  7314.       blit_cursor
  7315.     ENDIF
  7316.   ENDIF
  7317. RETURN
  7318. PROCEDURE haupt_dialog
  7319.   .| Glob. Var.: desk.top%,ev_mx&,ev_my&,k1&,k14&,kli%,ev_clicks&,ml%,m1xo&
  7320.   .|     mod1&,mod5&,last%,mod6&
  7321.   .| Felder    : whdl&(),frei%()
  7322.   .| Ruft auf  : coff,set_kleine_buttons,set_button,chk_fdc,change,menu_1
  7323.   .|     menu_2,menu_3,menu_4,menu_5,wind_top,menu_mess,clr_button,opt_help
  7324.   .| Aufruf in : message_auswerten-1,wind_mess-1,
  7325.   LOCAL a&,objc&,dum&
  7326.   '
  7327.   objc&=OBJC_FIND(desk.top%,0,3,ev_mx&,ev_my&)
  7328.   IF objc&>0
  7329.     coff
  7330.     SELECT objc&
  7331.       '
  7332.     CASE k1& TO k14&                    ! Kleine Buttons
  7333.       kli%=objc&-k1&+1
  7334.       '
  7335.       ~WIND_GET(whdl&(0),10,a&,dum&,dum&,dum&)
  7336.       IF a&=whdl&(0) AND ev_clicks&=2   ! Doppelklick + Buttons oben?
  7337.         set_kleine_buttons
  7338.       ELSE
  7339.         set_button(objc&)
  7340.         IF frei%(kli%,0)<>ml% AND frei%(kli%,1)>=m1xo&
  7341.           chk_fdc
  7342.           change
  7343.           ON frei%(kli%,0) GOSUB menu_1,menu_2,menu_3,menu_4,menu_5
  7344.           wind_top(whdl&(0))
  7345.         ENDIF
  7346.         menu_mess(0,frei%(kli%,1))
  7347.       ENDIF
  7348.       clr_button(objc&)
  7349.       '
  7350.     CASE mod1& TO mod5&         ! Modus wechseln
  7351.       change
  7352.       CLR last%
  7353.       chk_fdc
  7354.       ON objc&-mod1&+1 GOSUB menu_1,menu_2,menu_3,menu_4,menu_5
  7355.       wind_top(whdl&(0))
  7356.       '
  7357.     CASE mod6&
  7358.       opt_help
  7359.     ENDSELECT
  7360.     '
  7361.   ENDIF
  7362. RETURN
  7363. '
  7364. PROCEDURE wind_dklick
  7365.   .| Glob. Var.: mode%,d.isk%,ev_mx&,ev_my&,lgs%,len_fat%,bflag%,z%,tz%,bps%
  7366.   .|     spd%,spc%,anf_dat%,buf%,len_dir%,anf_fat2%
  7367.   .| Ruft auf  : coff,change,maus_pos,lesen,do_list
  7368.   .| Aufruf in : message_auswerten-1,
  7369.   LOCAL a%,aa%,cl%,cz%
  7370.   '
  7371.   coff
  7372.   change
  7373.   IF mode%=d.isk%
  7374.     maus_pos(ev_mx&,ev_my&)
  7375.     IF lgs%>=anf_fat1% AND lgs%<anf_dir%  ! = FAT
  7376.       '
  7377.       IF (bflag% AND 1)<>0
  7378.         cz%=INT((z%+tz%)/2)
  7379.         ADD cz%,(((lgs%-anf_fat1%) MOD len_fat%)*bps%) DIV 2
  7380.       ELSE
  7381.         cz%=INT((z%+tz%)/1.5)
  7382.         ADD cz%,(((lgs%-anf_fat1%) MOD len_fat%)*bps%)/1.5
  7383.       ENDIF
  7384.       lgs%=MIN(spd%-1,(cz%-2)*spc%+anf_dat%)
  7385.     ELSE
  7386.       IF lgs%>=anf_dir%                   ! woanders = DIR ?
  7387.         a%=INT((z%+tz%)/32)*32
  7388.         cl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26}
  7389.         IF cl%>0
  7390.           lgs%=anf_dat%+(cl%-2)*spc%
  7391.         ELSE
  7392.           lgs%=anf_dir%
  7393.         ENDIF
  7394.       ENDIF
  7395.       lgs%=MIN(spd%-1,lgs%)
  7396.     ENDIF
  7397.     lesen
  7398.     do_list
  7399.   ENDIF
  7400. RETURN
  7401. '
  7402. PROCEDURE menu_mess(m_titel&,m_eintrag&)
  7403.   .| Glob. Var.: menu_do%,ml0&,ml1o&,ml1u&,ml2o&,ml2u&,ml3o&,ml3u&,ml4o&,ml4u&
  7404.   .|     ml%,m1xo&,m2xo&,m3xo&,m4xo&,m5xo&,menu_pointer%
  7405.   .| Ruft auf  : coff,about_me,dat_lesen,dum,dat_sichern,dat_sichern_als
  7406.   .|     dat_drucken,pexec,start_shell,wind_cycle,exit,do_undo,ctrl_b,ctrl_k
  7407.   .|     ctrl_a,ctrl_h,alt_f,ctrl_t,alt_t,ctrl_c,info_crc,to_blk_anf
  7408.   .|     to_blk_end,ctrl_f,ctrl_g,alt_q,set_list_offset,address,infos
  7409.   .|     einstellungen,opt_text,opt_fehler,file_open,file_write,file_close
  7410.   .|     datei_info,file_dump,file_compare,datei_copy,datei_del,datei_suchen
  7411.   .|     disc_quick,datei_cut,datei_concat,sektor_read,sektor_write,cl_up
  7412.   .|     cl_down,sektor_compare,disc_clear,disc_check,disc_info,fat_bearbeiten
  7413.   .|     fat_cluster,fat_read1,fat_read2,fat_xor,fat_optimum,fat_test
  7414.   .|     fat_graph,dir_fldren,dir_sort,file_repair,dir_files,disc_load
  7415.   .|     disc_save,dir_root,dir_secsearch,ram_adress_read,ram_adress_write
  7416.   .|     ram_test,ram_cookie,ram_load,ram_save,disass,disass_konv,prg_load
  7417.   .|     clr_prg_load,hard_read,hard_write,hard_root,hard_search
  7418.   .|     hard_mode_sense,hard_mode_select,hard_statistik,hard_prot
  7419.   .|     hard_command,hard_copy,hard_ship,hard_format,hdx_bad,hdx_set_bad
  7420.   .|     hard_part,hard_zero,hard_install,hard_noboot,hard_save,hard_restore
  7421.   .|     fdc_trkread,fdc_trkwrite,fdc_readadress,fdc_anal,fdc_diskanal
  7422.   .|     anal_buf,fdc_trkinfo,fdc_secread,fdc_secwrite,fdc_speed,fdc_protect
  7423.   .|     fdc_head,fdc_steprate,fdc_null,fdc_trackconfig,convert
  7424.   .| Aufruf in : message_auswerten-1,haupt_dialog-1,
  7425.   LOCAL a&
  7426.   coff
  7427.   IF menu_do%=0
  7428.     menu_do%=1
  7429.     SELECT m_eintrag&
  7430.     CASE ml0&           ! SED
  7431.       about_me
  7432.     CASE ml1o& TO ml1u& ! Datei
  7433.       ON m_eintrag&-ml1o&+1 GOSUB dat_lesen,dum,dat_sichern,dat_sichern_als,dum,dat_drucken,dum,pexec,start_shell,dum,wind_cycle,dum,exit
  7434.     CASE ml2o& TO ml2u& ! Block
  7435.       ON m_eintrag&-ml2o&+1 GOSUB do_undo,dum,ctrl_b,ctrl_k,ctrl_a,ctrl_h,dum,alt_f,ctrl_t,alt_t,ctrl_c,info_crc,dum,to_blk_anf,to_blk_end
  7436.     CASE ml3o& TO ml3u& ! Suchen
  7437.       ON m_eintrag&-ml3o&+1 GOSUB ctrl_f,ctrl_g,alt_q,dum,set_list_offset,address
  7438.     CASE ml4o& TO ml4u& ! Hilfe/Optionen
  7439.       ON m_eintrag&-ml4o&+1 GOSUB infos,einstellungen,dum,opt_text,opt_fehler
  7440.       '
  7441.     DEFAULT
  7442.       SELECT ml%
  7443.       CASE 1            ! DATEI
  7444.         ON m_eintrag&-m1xo&+1 GOSUB file_open,file_write,dum,file_close,dum,datei_info,dum,file_dump,file_compare,dum,datei_copy,datei_del,dum,datei_suchen,disc_quick,dum,datei_cut,datei_concat,dum
  7445.       CASE 2            ! DISK
  7446.         a&=m_eintrag&-m2xo&+1
  7447.         SELECT a&
  7448.         CASE 1 TO 12
  7449.           ON a& GOSUB sektor_read,sektor_write,dum,cl_up,cl_down,dum,sektor_compare,disc_clear,disc_check,dum,disc_info
  7450.         CASE 13 TO 24
  7451.           ON a&-12 GOSUB fat_bearbeiten,dum,fat_cluster,dum,fat_read1,fat_read2,fat_xor,dum,fat_optimum,dum,fat_test,fat_graph
  7452.         CASE 26 TO 
  7453.           ON a&-25 GOSUB dir_fldren,dir_sort,dum,file_repair,dum,dir_files,dum,disc_load,disc_save,dum,dir_root,dir_secsearch
  7454.         ENDSELECT
  7455.       CASE 3            ! RAM
  7456.         ON m_eintrag&-m3xo&+1 GOSUB ram_adress_read,ram_adress_write,dum,ram_test,ram_cookie,dum,ram_load,ram_save,dum,disass,disass_konv,dum,prg_load,clr_prg_load
  7457.       CASE 4            ! PLATTE
  7458.         a&=m_eintrag&-m4xo&+1
  7459.         IF a&<17
  7460.           ON a& GOSUB hard_read,hard_write,dum,hard_root,hard_search,dum,hard_mode_sense,hard_mode_select,dum,hard_statistik,hard_prot,hard_command,dum,hard_copy,dum,hard_ship
  7461.         ELSE
  7462.           ON a&-17 GOSUB hard_format,hdx_bad,hdx_set_bad,dum,hard_part,hard_zero,dum,hard_install,hard_noboot,dum,hard_save,hard_restore
  7463.         ENDIF
  7464.       CASE 5            ! FLOPPY
  7465.         a&=m_eintrag&-m5xo&+1
  7466.         IF a&<14
  7467.           ON a& GOSUB fdc_trkread,fdc_trkwrite,dum,fdc_readadress,dum,fdc_anal,fdc_diskanal,anal_buf,dum,fdc_trkinfo,dum,fdc_secread,fdc_secwrite
  7468.         ELSE
  7469.           ON a&-14 GOSUB fdc_speed,fdc_protect,fdc_head,dum,fdc_steprate,dum,fdc_null,fdc_trackconfig,dum,convert
  7470.         ENDIF
  7471.       ENDSELECT
  7472.     ENDSELECT
  7473.     CLR menu_do%
  7474.   ENDIF
  7475.   ~MENU_TNORMAL(menu_pointer%,m_titel&,1)
  7476. RETURN
  7477. PROCEDURE menu_1                ! DATEI
  7478.   .| Glob. Var.: menu_adr%,m.enu1%,ml%,mod1&
  7479.   .| Ruft auf  : switch_menu,set_mod_button,file_on
  7480.   .| Aufruf in : base_look-1,set_kleine_buttons-1,haupt_dialog-2,
  7481.   switch_menu(menu_adr%,m.enu1%)
  7482.   ml%=1
  7483.   set_mod_button(mod1&)
  7484.   file_on
  7485. RETURN
  7486. PROCEDURE menu_2                ! DISK
  7487.   .| Glob. Var.: menu_adr%,m.enu2%,ml%,mod2&
  7488.   .| Ruft auf  : switch_menu,set_mod_button,disc_on
  7489.   .| Aufruf in : rsc_init-1,set_kleine_buttons-1,haupt_dialog-2,
  7490.   switch_menu(menu_adr%,m.enu2%)
  7491.   ml%=2
  7492.   set_mod_button(mod2&)
  7493.   disc_on
  7494. RETURN
  7495. PROCEDURE menu_3                ! RAM
  7496.   .| Glob. Var.: menu_adr%,m.enu3%,ml%,mod3&
  7497.   .| Ruft auf  : switch_menu,set_mod_button,ram_on
  7498.   .| Aufruf in : set_kleine_buttons-1,haupt_dialog-2,
  7499.   switch_menu(menu_adr%,m.enu3%)
  7500.   ml%=3
  7501.   set_mod_button(mod3&)
  7502.   ram_on
  7503. RETURN
  7504. PROCEDURE menu_4                ! PLATTE
  7505.   .| Glob. Var.: menu_adr%,m.enu4%,ml%,mod4&
  7506.   .| Ruft auf  : media_all,switch_menu,set_mod_button,hard_on
  7507.   .| Aufruf in : set_kleine_buttons-1,haupt_dialog-2,
  7508.   IF @media_all=0
  7509.     switch_menu(menu_adr%,m.enu4%)
  7510.     ml%=4
  7511.     set_mod_button(mod4&)
  7512.     hard_on
  7513.   ENDIF
  7514. RETURN
  7515. PROCEDURE menu_5                ! FLOPPY
  7516.   .| Glob. Var.: menu_adr%,m.enu5%,ml%,mod5&
  7517.   .| Ruft auf  : switch_menu,set_mod_button,fdc_on
  7518.   .| Aufruf in : set_kleine_buttons-1,haupt_dialog-2,
  7519.   switch_menu(menu_adr%,m.enu5%)
  7520.   ml%=5
  7521.   set_mod_button(mod5&)
  7522.   fdc_on
  7523. RETURN
  7524. PROCEDURE switch_menu(old_menu%,menu_adr%)
  7525.   .| Glob. Var.: menu_pointer%
  7526.   .| Ruft auf  : set_menu
  7527.   .| Aufruf in : menu_1-1,menu_2-1,menu_3-1,menu_4-1,menu_5-1
  7528.   .|     info_kleine_buttons-6,
  7529.   menu_pointer%=menu_adr%
  7530.   IF old_menu%>0
  7531.     ~MENU_BAR(old_menu%,0)
  7532.   ENDIF
  7533.   ~WIND_UPDATE(1)
  7534.   ~MENU_BAR(menu_adr%,1)
  7535.   ~WIND_UPDATE(0)
  7536.   old_menu%=menu_adr%
  7537.   set_menu
  7538. RETURN
  7539. ' ----------------------
  7540. PROCEDURE menu_init
  7541.   .| Glob. Var.: mendx4&
  7542.   .| Felder    : men_ienable%()
  7543.   .| Ruft auf  : menu_blkhide
  7544.   .| Aufruf in : rsc_init-1,
  7545.   men_ienable%(mendx4&)=0       ! Weiter suchen
  7546.   menu_blkhide(0)
  7547. RETURN
  7548. PROCEDURE menu_blkhide(a%)
  7549.   .| Glob. Var.: i%,mendx&,ml2u&
  7550.   .| Felder    : men_ienable%()
  7551.   .| Ruft auf  : set_menu
  7552.   .| Aufruf in : set_block-2,menu_init-1,ctrl_h-1,set_stat-4,set_found_block-1,
  7553.   FOR i%=mendx& TO ml2u&        ! BLOCKmarkierung löschen-Drucken...
  7554.     men_ienable%(i%)=a%
  7555.   NEXT i%
  7556.   set_menu
  7557. RETURN
  7558. PROCEDURE set_menu
  7559.   .| Glob. Var.: shell_p%,mendx0&,mendx&,ml2u&,menu_pointer%,mendx4&
  7560.   .| Felder    : men_ienable%()
  7561.   .| Ruft auf  : get_char$
  7562.   .| Aufruf in : switch_menu-1,menu_blkhide-1,search-1,info_kleine_buttons-1,
  7563.   LOCAL i&
  7564.   '
  7565.   shell_p%=LPEEK(&H4F6)
  7566.   IF shell_p%>0
  7567.     men_ienable%(mendx0&)=1
  7568.   ELSE
  7569.     men_ienable%(mendx0&)=0
  7570.   ENDIF
  7571.   FOR i&=mendx& TO ml2u&
  7572.     IF ASC(@get_char$(menu_pointer%,i&))<>45
  7573.       ~MENU_IENABLE(menu_pointer%,i&,men_ienable%(i&))
  7574.     ENDIF
  7575.   NEXT i&
  7576.   ~MENU_IENABLE(menu_pointer%,mendx0&,men_ienable%(mendx0&))
  7577.   ~MENU_IENABLE(menu_pointer%,mendx4&,men_ienable%(mendx4&))
  7578. RETURN
  7579. ' ----------------------
  7580. PROCEDURE wind_mess(w.mess%,whdl&,wx%,wy%,wb%,wh%)
  7581.   .| Glob. Var.: ev_mx&,ev_my&,desk.top%
  7582.   .| Felder    : wnr%(),whdl&(),wi%(),fe%()
  7583.   .| Ruft auf  : coff,redraw_list,haupt_dialog,wind_top,wind_size,set_slide
  7584.   .|     wind_slide,wind_hslide,wind_vslide,do_cursor_anz,set_desk
  7585.   .| Aufruf in : message_auswerten-1,
  7586.   LOCAL a%,b%,nr%
  7587.   '
  7588.   coff
  7589.   nr%=wnr%(whdl&) ! Windownummer durch Handle holen
  7590.   '
  7591.   SELECT w.mess%
  7592.   CASE 20        ! WM_REDRAW
  7593.     redraw_list(whdl&,wx%,wy%,wb%,wh%,1)
  7594.   CASE 21        ! WM_TOPPED
  7595.     a%=WIND_FIND(ev_mx&,ev_my&)
  7596.     b%=OBJC_FIND(desk.top%,0,3,ev_mx&,ev_my&)
  7597.     IF a%=whdl&(0) AND b%>0
  7598.       haupt_dialog
  7599.     ELSE
  7600.       wind_top(whdl&)
  7601.     ENDIF
  7602.     '  CASE 22        ! WM_CLOSE
  7603.     '   exit
  7604.   CASE 23        ! WM_FULLED
  7605.     wi%(nr%,0)=1-wi%(nr%,0)
  7606.     IF wi%(nr%,0)
  7607.       ~WIND_GET(whdl&,7,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4))
  7608.     ELSE
  7609.       ~WIND_GET(whdl&,6,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4))
  7610.     ENDIF
  7611.     wind_size(nr%,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4))
  7612.     set_slide(whdl&)
  7613.   CASE 24        ! WM_ARROWED
  7614.     wind_slide(nr%,wx%)
  7615.     set_slide(whdl&)
  7616.   CASE 25        ! WM_HSLID
  7617.     wind_hslide(whdl&,wx%)
  7618.     set_slide(whdl&)
  7619.   CASE 26        ! WM_VSLID
  7620.     wind_vslide(whdl&,wx%)
  7621.     set_slide(whdl&)
  7622.   CASE 27        ! WM_SIZED
  7623.     wind_size(nr%,wx%,wy%,wb%,wh%)
  7624.     set_slide(whdl&)
  7625.     do_cursor_anz(nr%)
  7626.   CASE 28        ! WM_MOVED
  7627.     wind_size(nr%,wx%,wy%,wb%,wh%)
  7628.     set_desk
  7629.     do_cursor_anz(nr%)
  7630.   CASE 29        ! WM_NEWTOP
  7631.     wind_top(whdl&)
  7632.   ENDSELECT
  7633. RETURN
  7634. PROCEDURE wind_slide(nr%,wx%)
  7635.   .| Glob. Var.: z%,wzb%,l_end%,top%,wz%,out%,txt_links%,wc%,txt_breite%
  7636.   .| Felder    : whdl&()
  7637.   .| Ruft auf  : redraw,scrolldown,scrollup,hpage_l,hpage_r,prev,next
  7638.   .|     cursor_anz,scroll_right,scroll_left
  7639.   .| Aufruf in : wind_mess-1,
  7640.   LOCAL whdl&
  7641.   '
  7642.   whdl&=whdl&(nr%)
  7643.   '  wind_aktpar(nr%)
  7644.   IF nr%=0
  7645.     SELECT wx%
  7646.     CASE 0
  7647.       z%=MAX(0,z%-wzb%)
  7648.       redraw(nr%)
  7649.     CASE 1
  7650.       z%=MIN(l_end%-wzb%,z%+wzb%)
  7651.       redraw(nr%)
  7652.     CASE 2
  7653.       scrolldown(nr%)
  7654.     CASE 3
  7655.       scrollup(nr%)
  7656.     CASE 4
  7657.       hpage_l
  7658.     CASE 5
  7659.       hpage_r
  7660.     CASE 6
  7661.       prev(nr%)
  7662.     CASE 7
  7663.       next(nr%)
  7664.     ENDSELECT
  7665.     cursor_anz(nr%)
  7666.   ELSE
  7667.     SELECT wx%
  7668.     CASE 0
  7669.       IF top%<>1
  7670.         top%=MAX(1,top%-wz%)
  7671.         redraw(nr%)
  7672.       ENDIF
  7673.     CASE 1
  7674.       IF top%<out%-wz%
  7675.         top%=MIN(out%-wz%,top%+wz%)
  7676.         redraw(nr%)
  7677.       ENDIF
  7678.     CASE 2
  7679.       scrolldown(nr%)
  7680.     CASE 3
  7681.       scrollup(nr%)
  7682.     CASE 4
  7683.       txt_links%=MAX(0,txt_links%-wc%)
  7684.       redraw(nr%)
  7685.     CASE 5
  7686.       txt_links%=MIN(txt_links%+wc%,txt_breite%-wc%)
  7687.       redraw(nr%)
  7688.     CASE 6
  7689.       scroll_right
  7690.     CASE 7
  7691.       scroll_left
  7692.     ENDSELECT
  7693.   ENDIF
  7694. RETURN
  7695. PROCEDURE wind_hslide(whdl&,wx%)
  7696.   .| Glob. Var.: mode%,d.isk%,lgs%,spd%,f.ile%,fp%,fl%,bps%,h.ard%,block%
  7697.   .|     hi_size%,r.am%,ram_addr%,ram_max%,f.dc%,track%,tpd%,txt_links%
  7698.   .|     txt_breite%,wc%
  7699.   .| Felder    : wnr%()
  7700.   .| Ruft auf  : change,lesen,redraw
  7701.   .| Aufruf in : wind_mess-1,
  7702.   LOCAL nr%
  7703.   '
  7704.   nr%=wnr%(whdl&)
  7705.   IF nr%=0
  7706.     change
  7707.     SELECT mode%
  7708.     CASE d.isk%
  7709.       lgs%=(spd%-1)/1000*wx%
  7710.     CASE f.ile%
  7711.       fp%=MIN(fl%-bps%,fl%/1000*wx%)
  7712.     CASE h.ard%
  7713.       block%=MAX(0,(hi_size%-1)/1000*wx%)
  7714.     CASE r.am%
  7715.       ram_addr%=ram_max%/1000*wx%
  7716.     CASE f.dc%
  7717.       track%=(tpd%-1)/1000*wx%
  7718.     ENDSELECT
  7719.     lesen
  7720.   ELSE
  7721.     txt_links%=MAX(0,txt_breite%-wc%)/1000*wx%
  7722.   ENDIF
  7723.   redraw(nr%)
  7724. RETURN
  7725. PROCEDURE wind_vslide(whdl&,wx%)
  7726.   .| Glob. Var.: z%,l_end%,wzb%,top%,out%,wz%
  7727.   .| Felder    : wnr%()
  7728.   .| Ruft auf  : redraw
  7729.   .| Aufruf in : wind_mess-1,
  7730.   LOCAL nr%
  7731.   '
  7732.   nr%=wnr%(whdl&)
  7733.   IF nr%=0
  7734.     z%=INT((wx%+1)/1000*(l_end%-wzb%)/16)*16
  7735.   ELSE
  7736.     top%=MAX(1,MIN(out%-wz%,(wx%+1)/1000*(out%-wz%)))
  7737.   ENDIF
  7738.   redraw(nr%)
  7739. RETURN
  7740. PROCEDURE set_slide(whdl&)
  7741.   .| Glob. Var.: s.lider%,box_draw%,z%,wz%,mode%,d.isk%,spd%,lgs%,f.ile%,fl%
  7742.   .|     fp%,h.ard%,hi_size%,block%,r.am%,ram_max%,ram_addr%,f.dc%,tpd%,track%
  7743.   .|     top%,out%,txt_breite%,wc%,txt_links%
  7744.   .| Felder    : wnr%()
  7745.   .| Ruft auf  : wind_aktpar
  7746.   .| Aufruf in : hard_do_copy-1,rst-1,fdc_trackconfig-1,lesen-1,do_undo-1
  7747.   .|     set_block-1,txt_block-1,wind_mess-5,wind_open-1,wind_set-1
  7748.   .|     wind_top-1,scroll_right-1,scroll_left-1,set_w-1,do_clr_out-1
  7749.   .|     out_do-1,boot_sec-1,disc_check-1,file_read-1,taste-2,cursor-1
  7750.   .|     alt_q-1,ctrl_f-1,edit_ascii-2,scrollup-1,scrolldown-1,top-1,lend-1
  7751.   .|     down-1,up-1,search_lesen-1,search_found-1,fat_xor-1,
  7752.   LOCAL oldxpos%,oldypos%,newxpos%,newypos%,dum%
  7753.   LOCAL oldxbig%,oldybig%,newxbig%,newybig%
  7754.   LOCAL mx%,my%,mb%,mk%,l_end%,nr%
  7755.   '
  7756.   nr%=wnr%(whdl&)
  7757.   wind_aktpar(nr%)
  7758.   IF s.lider%>0
  7759.     CLR mb%
  7760.   ELSE
  7761.     ~GRAF_MKSTATE(mx%,my%,mb%,mk%)
  7762.   ENDIF
  7763.   IF whdl&>0 AND mb%=0 AND box_draw%=0
  7764.     ~WIND_GET(whdl&,8,oldxpos%,dum%,dum%,dum%)
  7765.     ~WIND_GET(whdl&,9,oldypos%,dum%,dum%,dum%)
  7766.     ~WIND_GET(whdl&,15,oldxbig%,dum%,dum%,dum%)
  7767.     ~WIND_GET(whdl&,16,oldybig%,dum%,dum%,dum%)
  7768.     '
  7769.     IF nr%=0
  7770.       l_end%=MAX(1,l_end%)
  7771.       newypos%=z%/16/MAX(1,(l_end%/16)-wz%)*1000
  7772.       newybig%=wz%/(l_end%/16)*1000
  7773.       SELECT mode%
  7774.       CASE d.isk%
  7775.         CLR newxbig%
  7776.         newxpos%=1000/spd%*lgs%
  7777.         newybig%=wz%/(l_end%/16)*1000
  7778.       CASE f.ile%
  7779.         newxpos%=1000/MAX(1,fl%-l_end%)*fp%
  7780.         newxbig%=1000/((MAX(1,fl%)/l_end%))
  7781.       CASE h.ard%
  7782.         newxpos%=1000/MAX(1,hi_size%)*block%
  7783.         CLR newxbig%
  7784.       CASE r.am%
  7785.         newxpos%=1000/ram_max%*ram_addr%
  7786.         CLR newxbig%
  7787.       CASE f.dc%
  7788.         newxpos%=1000/MAX(1,tpd%)*track%
  7789.         newxbig%=1000/MAX(1,tpd%)
  7790.       ENDSELECT
  7791.     ELSE
  7792.       newypos%=1000/MAX(1,l_end%-wz%-1)*(top%-1)
  7793.       newybig%=MAX(1,wz%)/MAX(1,out%-1)*1000
  7794.       ' wz%: Anzahl der Zeilen
  7795.       newxpos%=1000/MAX(1,txt_breite%-wc%)*txt_links%
  7796.       newxbig%=1000/((MAX(1,txt_breite%)/MAX(1,wc%)))
  7797.       IF newxbig%>999
  7798.         CLR txt_links%
  7799.       ENDIF
  7800.     ENDIF
  7801.     newxpos%=MIN(1000,newxpos%)
  7802.     newypos%=MIN(1000,newypos%)
  7803.     newxbig%=MIN(1000,newxbig%)
  7804.     newybig%=MIN(1000,newybig%)
  7805.     '
  7806.     IF newxbig%<>oldxbig%
  7807.       ~WIND_SET(whdl&,15,newxbig%,0,0,0)
  7808.     ENDIF
  7809.     IF newybig%<>oldybig%
  7810.       ~WIND_SET(whdl&,16,newybig%,0,0,0)
  7811.     ENDIF
  7812.     IF newxpos%<>oldxpos%
  7813.       ~WIND_SET(whdl&,8,newxpos%,0,0,0)
  7814.     ENDIF
  7815.     IF newypos%<>oldypos%
  7816.       ~WIND_SET(whdl&,9,newypos%,0,0,0)
  7817.     ENDIF
  7818.   ENDIF
  7819. RETURN
  7820. PROCEDURE hpage_l
  7821.   .| Glob. Var.: mode%,d.isk%,lgs%,f.ile%,fp%,buf_size%,h.ard%,block%,r.am%
  7822.   .|     ram_addr%,f.dc%,track%
  7823.   .| Ruft auf  : change,lesen,redraw
  7824.   .| Aufruf in : wind_slide-1,
  7825.   change
  7826.   SELECT mode%
  7827.   CASE d.isk%
  7828.     lgs%=MAX(0,lgs%-10)
  7829.   CASE f.ile%
  7830.     fp%=MAX(0,fp%-buf_size%)
  7831.   CASE h.ard%
  7832.     block%=MAX(0,block%-10)
  7833.   CASE r.am%
  7834.     ram_addr%=MAX(0,ram_addr%-1024)
  7835.   CASE f.dc%
  7836.     track%=MAX(0,track%-5)
  7837.   ENDSELECT
  7838.   lesen
  7839.   redraw(0)
  7840. RETURN
  7841. PROCEDURE hpage_r
  7842.   .| Glob. Var.: mode%,d.isk%,lgs%,spd%,f.ile%,fp%,fl%,buf_size%,h.ard%,block%
  7843.   .|     hi_size%,r.am%,ram_addr%,f.dc%,track%
  7844.   .| Ruft auf  : change,lesen,redraw
  7845.   .| Aufruf in : wind_slide-1,
  7846.   change
  7847.   SELECT mode%
  7848.   CASE d.isk%
  7849.     lgs%=MIN(spd%-1,lgs%+10)
  7850.   CASE f.ile%
  7851.     fp%=MIN(fl%-buf_size%,fp%+buf_size%)
  7852.   CASE h.ard%
  7853.     block%=MAX(0,MIN(hi_size%-1,block%+10))
  7854.   CASE r.am%
  7855.     ADD ram_addr%,1024
  7856.   CASE f.dc%
  7857.     ADD track%,5
  7858.   ENDSELECT
  7859.   lesen
  7860.   redraw(0)
  7861. RETURN
  7862. '
  7863. PROCEDURE wind_open(nr%)
  7864.   .| Glob. Var.: dx%,dy%,dw%,dh%,wx&,wy&,wb&,wh&,scr_handle%
  7865.   .| Felder    : whdl&(),wnr%(),w_titel%(),fe%()
  7866.   .| Ruft auf  : vs_clip,vr_recfl,set_slide,alrt,do_exit
  7867.   .| Aufruf in : wind_init-2,
  7868.   LOCAL handle&
  7869.   handle&=WIND_CREATE(4077,dx%,dy%,dw%,dh%)
  7870.   IF handle&>0
  7871.     whdl&(nr%)=handle&
  7872.     wnr%(handle&)=nr%
  7873.     CARD{w_titel%(nr%)}=0       ! erst mal kein Titel
  7874.     ~WIND_SET(handle&,2,CARD(SWAP(w_titel%(nr%))),CARD(w_titel%(nr%)),0,0)
  7875.     ~WIND_OPEN(handle&,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4))
  7876.     ~WIND_GET(handle&,4,wx&,wy&,wb&,wh&)
  7877.     vs_clip(scr_handle%,1,wx&,wy&,wb&,wh&)
  7878.     ~WIND_UPDATE(1)
  7879.     ~GRAF_MOUSE(256,0)
  7880.     vr_recfl(scr_handle%,wx&,wy&,wb&,wh&)
  7881.     ~GRAF_MOUSE(257,0)
  7882.     ~WIND_UPDATE(0)
  7883.     set_slide(handle&)
  7884.   ELSE
  7885.     ~@alrt(3,"Kann Fenster nicht öffnen.",3,"Abbruch")
  7886.     do_exit
  7887.   ENDIF
  7888. RETURN
  7889. PROCEDURE wind_pos(nr%)
  7890.   .| Glob. Var.: wz%,z.hoehe%,wc%,z.breite%,tx%,ty%,desk.top%,ground&
  7891.   .| Felder    : whdl&(),wi%()
  7892.   .| Ruft auf  : set_aktpar
  7893.   .| Aufruf in : wind_init-1,wind_size-1,wind_set-1,
  7894.   ~WIND_GET(whdl&(nr%),4,wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4))
  7895.   wz%=(wi%(nr%,4) DIV z.hoehe%)-1
  7896.   wc%=wi%(nr%,3)/z.breite%-1        ! Breite in Zeichen
  7897.   tx%=((wi%(nr%,1)+1+7) DIV 8)*8    ! x-Ausgabe
  7898.   ty%=wi%(nr%,2)+2*z.hoehe%+0       ! y-   "
  7899.   IF nr%=0
  7900.     ADD ty%,OB_H(desk.top%,ground&)
  7901.     SUB wz%,OB_H(desk.top%,ground&)/z.hoehe%
  7902.   ENDIF
  7903.   set_aktpar(nr%)
  7904. RETURN
  7905. PROCEDURE wind_calc(nr%)
  7906.   .| Glob. Var.: wz%,z.hoehe%,l_end%,wzb%
  7907.   .| Felder    : fe%(),wi%(),wz%()
  7908.   .| Aufruf in : wind_init-1,wind_set-1,
  7909.   ' Maße und Position des Arbeits-Fensters vorbestimmen
  7910.   ~WIND_CALC(1,4079,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4),wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4))
  7911.   ' Jetzt stehen in wi%() die Innenmaße
  7912.   '  fe%(nr%,3)=MIN(fe%(nr%,3),76*z.breite%+fe%(nr%,3)-wi%(nr%,3))
  7913.   IF nr%=1
  7914.     wz%=wi%(nr%,4) DIV z.hoehe%
  7915.   ELSE
  7916.     wz%=MIN(l_end%/16,wi%(nr%,4) DIV z.hoehe%)
  7917.   ENDIF
  7918.   wz%(nr%)=wz%
  7919.   wzb%=wz%*16
  7920.   fe%(nr%,4)=MAX(wz%*z.hoehe%+fe%(nr%,4)-wi%(nr%,4),fe%(nr%,4))+2
  7921.   ~WIND_CALC(1,4079,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4),wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4))
  7922. RETURN
  7923. PROCEDURE wind_size(nr%,wx%,wy%,wb%,wh%)
  7924.   .| Glob. Var.: desk.top%,z.hoehe%,scr_width%,scr_height%,z.breite%,wz%,bps%
  7925.   .|     buttons&,wzb%,z%,xt%,yt%,tz%,hex!,top%,out%
  7926.   .| Felder    : whdl&(),wi%(),wz%(),fe%()
  7927.   .| Ruft auf  : wind_pos,redraw
  7928.   .| Aufruf in : wind_init-1,wind_mess-3,wind_set-1,
  7929.   LOCAL wxx%,whdl&,ddh%
  7930.   '                             hier kommen Außenmaße
  7931.   ddh%=OB_H(desk.top%,0)
  7932.   whdl&=whdl&(nr%)
  7933.   wh%=MAX(10*z.hoehe%,wh%)
  7934.   wb%=MIN(scr_width%-8,wb%)
  7935.   wh%=MIN(scr_height%-8,wh%)
  7936.   '
  7937.   ' wx,wy,... umrechnen in wi%(...)
  7938.   ~WIND_CALC(1,4079,wx%,wy%,wb%,wh%,wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4))
  7939.   wxx%=wh%-wi%(nr%,4)           ! Differenz Fenster aussen-innen
  7940.   '
  7941.   wb%=(wi%(nr%,3) DIV z.breite%)*z.breite%+4+wb%-wi%(nr%,3)-1 ! fiel vom Himmel
  7942.   '
  7943.   IF nr%=0
  7944.     wz%=(wi%(nr%,4)-ddh%) DIV z.hoehe%+1
  7945.     IF wz%>bps%/16 AND nr%=0
  7946.       wz%=bps%/16+2
  7947.     ENDIF
  7948.     wh%=wz%*z.hoehe%+ddh%+wxx%-z.hoehe%+2
  7949.     wb%=MAX(OB_W(desk.top%,buttons&)+10,wb%)
  7950.   ELSE
  7951.     wz%=(wi%(nr%,4) DIV z.hoehe%)
  7952.     wh%=wz%*z.hoehe%+wxx%+2
  7953.     wb%=MAX(wb%,30*z.breite%)
  7954.   ENDIF
  7955.   '
  7956.   IF wh%>scr_height%
  7957.     SUB wh%,z.hoehe%*2
  7958.   ENDIF
  7959.   '
  7960.   wz%(nr%)=wz%                  ! Anzahl der Zeilen merken
  7961.   wzb%=wz%*16
  7962.   '
  7963.   wx%=MAX(4,(wx% DIV 8)*8+4)
  7964.   '
  7965.   ~WIND_SET(whdl&(nr%),5,wx%,wy%,wb%,wh%)
  7966.   ~WIND_GET(whdl&(nr%),5,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4))
  7967.   wind_pos(nr%)
  7968.   '
  7969.   IF nr%=0
  7970.     CLR z%,xt%,yt%,tz%
  7971.     hex!=TRUE
  7972.   ELSE
  7973.     IF top%+wz%>out%
  7974.       top%=MAX(1,out%-wz%)
  7975.     ENDIF
  7976.   ENDIF
  7977.   redraw(nr%)
  7978. RETURN
  7979. PROCEDURE wind_clr(whdl&)
  7980.   .| Glob. Var.: wx&,wy&,wb&,wh&,scr_handle%
  7981.   .| Ruft auf  : vs_clip,vr_recfl
  7982.   .| Aufruf in : wind_set-1,
  7983.   ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&)
  7984.   vs_clip(scr_handle%,1,wx&,wy&,wb&,wh&)
  7985.   ~WIND_UPDATE(1)
  7986.   ~GRAF_MOUSE(256,0)
  7987.   vr_recfl(scr_handle%,wx&,wy&,wb&,wh&)
  7988.   ~GRAF_MOUSE(257,0)
  7989.   ~WIND_UPDATE(0)
  7990.   vs_clip(scr_handle%,0,0,0,0,0)
  7991. RETURN
  7992. PROCEDURE wind_set(whdl&)
  7993.   .| Glob. Var.: wx&,wy&,wb&,wh&
  7994.   .| Felder    : wnr%(),fe%()
  7995.   .| Ruft auf  : set_vdipar,wind_pos,wind_calc,wind_size,wind_clr,set_slide
  7996.   .|     redraw_list
  7997.   .| Aufruf in : hard_on-1,disc_drive-1,
  7998.   LOCAL nr%
  7999.   nr%=wnr%(whdl&)
  8000.   set_vdipar
  8001.   wind_pos(whdl&)
  8002.   wind_calc(whdl&)
  8003.   wind_size(nr%,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4))
  8004.   wind_clr(whdl&)
  8005.   set_slide(whdl&)
  8006.   ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&)
  8007.   redraw_list(whdl&,wx&,wy&,wb&,wh&,0)
  8008. RETURN
  8009. PROCEDURE wind_top(whdl&)
  8010.   .| Glob. Var.: wind%
  8011.   .| Felder    : wnr%()
  8012.   .| Ruft auf  : coff,wind_aktpar,set_slide,set_stat
  8013.   .| Aufruf in : last_11-1,last_7-1,haupt_dialog-2,wind_mess-2,wind_cycle-1
  8014.   .|     no_on-1,out_do-1,disc_check-1,last_5-2,last_10-1,dir_secsearch-1
  8015.   .|     last_3-1,ctrl_h-1,floskel-1,opt_text-1,last_4-1,
  8016.   ~FRE(0)
  8017.   coff
  8018.   ~WIND_SET(whdl&,10,0,0,0,0)
  8019.   wind%=wnr%(whdl&)
  8020.   wind_aktpar(wind%)
  8021.   set_slide(whdl&)
  8022.   set_stat
  8023.   '  do_cursor_anz(wind%)       !??
  8024. RETURN
  8025. PROCEDURE wind_new
  8026.   .| Aufruf in : do_pexec-1,
  8027.   CARD{GCONTRL}=109
  8028.   {GCONTRL+2}=0
  8029.   {GCONTRL+6}=0
  8030.   GEMSYS
  8031. RETURN
  8032. PROCEDURE wind_cycle
  8033.   .| Glob. Var.: wind%
  8034.   .| Felder    : whdl&()
  8035.   .| Ruft auf  : wind_top
  8036.   .| Aufruf in : menu_mess-1,
  8037.   wind%=1-wind%
  8038.   wind_top(whdl&(wind%))
  8039.   ~EVNT_TIMER(100)
  8040. RETURN
  8041. PROCEDURE wind_aktpar(nr%)      ! aktuelle Fensterdaten holen
  8042.   .| Glob. Var.: wz%,wzb%,wc%,tx%,ty%,l_end%
  8043.   .| Felder    : wz%(),wc%(),tx%(),ty%(),l_end%()
  8044.   .| Aufruf in : message_auswerten-2,set_slide-1,wind_top-1,redraw_list-1
  8045.   .|     scrollup-1,scrolldown-1,
  8046.   wz%=wz%(nr%)
  8047.   wzb%=wz%*16
  8048.   wc%=wc%(nr%)
  8049.   tx%=tx%(nr%)
  8050.   ty%=ty%(nr%)
  8051.   l_end%=l_end%(nr%)
  8052. RETURN
  8053. PROCEDURE set_aktpar(nr%)
  8054.   .| Glob. Var.: l_end%,wc%,wz%,tx%,ty%
  8055.   .| Felder    : l_end%(),wc%(),wz%(),tx%(),ty%()
  8056.   .| Aufruf in : var_init-1,fdc_anal-1,wind_pos-1,file_on-1,fdc_on-1,
  8057.   l_end%(nr%)=l_end%
  8058.   wc%(nr%)=wc%
  8059.   wz%(nr%)=wz%
  8060.   tx%(nr%)=tx%
  8061.   ty%(nr%)=ty%
  8062. RETURN
  8063. PROCEDURE desktop_weg
  8064.   .| Glob. Var.: menu_pointer%
  8065.   .| Felder    : whdl&()
  8066.   .| Aufruf in : setfont-1,do_pexec-1,start_shell-1,
  8067.   ~WIND_CLOSE(whdl&(0))
  8068.   ~WIND_CLOSE(whdl&(1))
  8069.   ~WIND_DELETE(whdl&(0))
  8070.   ~WIND_DELETE(whdl&(1))
  8071.   ~MENU_BAR(menu_pointer%,0)
  8072. RETURN
  8073. PROCEDURE desktop_back
  8074.   .| Glob. Var.: menu_pointer%
  8075.   .| Ruft auf  : wind_init,do_cursor_anz
  8076.   .| Aufruf in : setfont-1,do_pexec-1,start_shell-1,
  8077.   wind_init                     ! Fenster öffnen
  8078.   ~MENU_BAR(menu_pointer%,1)    ! Menu ein
  8079.   do_cursor_anz(0)
  8080. RETURN
  8081. ' ----------------------
  8082. PROCEDURE redraw_list(whdl&,wx%,wy%,wb%,wh%,msc%)
  8083.   .| Glob. Var.: desk.top%,ground&,scr_handle%,z.hoehe%,info_line$,ty%,z%
  8084.   .|     vdi_par%,buf%,ak%,offset%,mode%,f.ile%,fp%,r.am%,ram_addr%,zeile%,tx%
  8085.   .|     wc%,wz%,top%,z_buf%,txt_blkon%,txt_links%
  8086.   .| Felder    : wnr%(),wi%(),tx%(),ty%(),out$()
  8087.   .| Ruft auf  : wind_aktpar,redraw_desk,vs_clip,get_info,vr_recfl,v_gtext
  8088.   .|     v_line,out_txt_line,cursor_anz,mnorm
  8089.   .| Aufruf in : wind_mess-1,wind_set-1,wind_update-1,info_line-1
  8090.   .|     scroll_right-1,scroll_left-1,opt_text-1,
  8091.   LOCAL ddh%,az%,br%,i%,r%,wgx&,wgy&,wgb&,wgh&,a$
  8092.   LOCAL rx%,ry%,rb%,rh%
  8093.   '
  8094.   r%=wnr%(whdl&)        ! Window nummer
  8095.   wind_aktpar(r%)
  8096.   '
  8097.   ddh%=OB_H(desk.top%,ground&)
  8098.   IF r%=0 AND wy%<wi%(0,2)+ddh%
  8099.     redraw_desk(ground&)
  8100.   ENDIF
  8101.   '
  8102.   rx%=wi%(r%,1)
  8103.   ry%=wi%(r%,2)
  8104.   rb%=wi%(r%,3)
  8105.   rh%=wi%(r%,4)
  8106.   '
  8107.   ~WIND_UPDATE(1)
  8108.   ~WIND_GET(whdl&,11,wgx&,wgy&,wgb&,wgh&)       ! 1.Rechteck holen
  8109.   WHILE wgh&>0 AND wgb&>0
  8110.     IF RC_INTERSECT(wx%,wy%,wb%,wh%,wgx&,wgy&,wgb&,wgh&)=TRUE
  8111.       '
  8112.       ~GRAF_MOUSE(256,0)
  8113.       vs_clip(scr_handle%,1,wgx&,wgy&,wgb&,wgh&)
  8114.       get_info(r%)
  8115.       '
  8116.       IF r%=0                   ! Datenfenster?
  8117.         '
  8118.         IF msc%=1               ! Fenster ganz löschen?
  8119.           vr_recfl(scr_handle%,rx%,ry%+ddh%+1,rb%,rh%)
  8120.         ENDIF
  8121.         ' Statuszeile schreiben
  8122.         v_gtext(tx%(r%),ry%+z.hoehe%+ddh%,info_line$)
  8123.         ' Linie unter Statuszeile
  8124.         v_line(scr_handle%,rx%,ty%-z.hoehe%,rx%+rb%-1,ty%-z.hoehe%)
  8125.         IF msc%<2
  8126.           z%=MAX(0,z%)
  8127.           {vdi_par%}=z%+buf%        ! Daten
  8128.           {vdi_par%+4}=z%+ak%       ! Status
  8129.           {vdi_par%+8}=z%+offset%-(mode%=f.ile%)*fp%-(mode%=r.am%)*ram_addr%
  8130.           ~C:zeile%(0,L:vdi_par%,tx%,ty%,wc%+1,wz%,-1)
  8131.           '        Opcode,Struct,x-Pos,  y- ,   Spalte,Zeile,Byte(-1=alles)
  8132.         ENDIF
  8133.       ELSE
  8134.         IF msc%=1
  8135.           vr_recfl(scr_handle%,rx%,ry%,rb%,rh%)
  8136.         ENDIF
  8137.         ' Statuszeile schreiben
  8138.         v_gtext(tx%(r%),ty%(r%)-z.hoehe%-1,LEFT$(out$(0)+STRING$(wc%,32),wc%))
  8139.         ' Linie unter Statuszeile
  8140.         v_line(scr_handle%,rx%,ty%-z.hoehe%,rx%+rb%,ty%-z.hoehe%)
  8141.         az%=ty%
  8142.         top%=MAX(1,top%)
  8143.         {vdi_par%}=z_buf%
  8144.         br%=wc%+1
  8145.         '
  8146.         IF txt_blkon%=0
  8147.           FOR i%=top% TO top%+wz%-1
  8148.             a$=LEFT$(MID$(out$(i%),txt_links%+1,wc%)+STRING$(wc%,32),br%)+CHR$(0)
  8149.             BMOVE V:a$,z_buf%,LEN(a$)
  8150.             ~C:zeile%(1,L:vdi_par%,tx%,az%,br%,0,0)
  8151.             ADD az%,z.hoehe%
  8152.           NEXT i%
  8153.         ELSE
  8154.           FOR i%=top% TO top%+wz%-1
  8155.             a$=LEFT$(MID$(out$(i%),txt_links%+1,wc%)+STRING$(wc%,32),br%)+CHR$(0)
  8156.             BMOVE V:a$,z_buf%,LEN(a$)
  8157.             out_txt_line(i%,br%,tx%,az%)
  8158.             ADD az%,z.hoehe%
  8159.           NEXT i%
  8160.         ENDIF
  8161.         '
  8162.       ENDIF
  8163.       ~GRAF_MOUSE(257,0)
  8164.     ENDIF
  8165.     ~WIND_GET(whdl&,12,wgx&,wgy&,wgb&,wgh&)
  8166.   WEND
  8167.   ~WIND_UPDATE(0)
  8168.   '
  8169.   vs_clip(scr_handle%,0,0,0,0,0)
  8170.   cursor_anz(r%)
  8171.   mnorm
  8172. RETURN
  8173. PROCEDURE zeile(zl%)            ! Zeile ausgeben
  8174.   .| Glob. Var.: scr_handle%,wind%,z%,vdi_par%,buf%,ak%,offset%,mode%,f.ile%
  8175.   .|     fp%,r.am%,ram_addr%,zeile%,z.hoehe%,wc%
  8176.   .| Felder    : wi%(),tx%(),ty%()
  8177.   .| Ruft auf  : vs_clip
  8178.   .| Aufruf in : set_block-2,scrollup-1,scrolldown-1,
  8179.   LOCAL zg%
  8180.   vs_clip(scr_handle%,1,wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4))
  8181.   zg%=z%+zl%*16
  8182.   {vdi_par%}=zg%+buf%
  8183.   {vdi_par%+4}=zg%+ak%
  8184.   {vdi_par%+8}=zg%+offset%-(mode%=f.ile%)*fp%-(mode%=r.am%)*ram_addr%
  8185.   ~WIND_UPDATE(1)
  8186.   ~C:zeile%(0,L:vdi_par%,tx%(wind%),ty%(wind%)+zl%*z.hoehe%,wc%+1,1,-1)
  8187.   '         Opcode,Struct,x-Pos,y-,Spalten,Zeilen,alles)
  8188.   ~WIND_UPDATE(0)
  8189.   vs_clip(scr_handle%,0,0,0,0,0)
  8190. RETURN
  8191. PROCEDURE byte(zl%,by%)         ! Byte ausgeben
  8192.   .| Glob. Var.: z%,vdi_par%,buf%,ak%,offset%,mode%,f.ile%,fp%,r.am%,ram_addr%
  8193.   .|     zeile%,tx%,ty%,z.hoehe%,wc%
  8194.   .| Aufruf in : edit_ex-2,
  8195.   LOCAL zg%
  8196.   zg%=z%+zl%*16
  8197.   {vdi_par%}=zg%+buf%
  8198.   {vdi_par%+4}=zg%+ak%
  8199.   {vdi_par%+8}=zg%+offset%-(mode%=f.ile%)*fp%-(mode%=r.am%)*ram_addr%
  8200.   ~GRAF_MOUSE(256,0)
  8201.   ~WIND_UPDATE(1)
  8202.   ~C:zeile%(0,L:vdi_par%,tx%,ty%+zl%*z.hoehe%,wc%+1,1,by%)
  8203.   '         Opcode,Struct,x-Pos,y- ,Spalten,Zeilen,Nummer des Bytes(-1 = alles)
  8204.   ~WIND_UPDATE(0)
  8205.   ~GRAF_MOUSE(257,0)
  8206. RETURN
  8207. PROCEDURE text_line(zl%)        ! Eine Textzeile ausgeben
  8208.   .| Glob. Var.: scr_handle%,wind%,txt_links%,z_buf%,vdi_par%,top%,z.hoehe%
  8209.   .| Felder    : wi%(),out$(),wc%(),tx%(),ty%()
  8210.   .| Ruft auf  : vs_clip,out_txt_line
  8211.   .| Aufruf in : txt_block-2,edit_ascii-1,scrollup-1,scrolldown-1,
  8212.   LOCAL a$,a%,i%
  8213.   a%=zl%-1
  8214.   vs_clip(scr_handle%,1,wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4))
  8215.   a$=LEFT$(MID$(out$(a%),txt_links%+1,wc%(1))+STRING$(wc%(1),32),wc%(1)+1)
  8216.   BMOVE V:a$,z_buf%,wc%(1)+1
  8217.   {vdi_par%}=z_buf%
  8218.   ~WIND_UPDATE(1)
  8219.   out_txt_line(a%,wc%(1)+1,tx%(1),ty%(1)+MAX(0,(a%-top%))*z.hoehe%)
  8220.   ~WIND_UPDATE(0)
  8221.   vs_clip(scr_handle%,0,0,0,0,0)
  8222. RETURN
  8223. PROCEDURE out_txt_line(i%,br%,x%,y%)
  8224.   .| Glob. Var.: tblkaz%,tblkez%,tbuf_beg%,tbuf_end%,zeile%,vdi_par%,tblkes%
  8225.   .|     tblkas%,txt_links%
  8226.   .| Aufruf in : redraw_list-1,text_line-1,
  8227.   IF i%<tblkaz% OR i%>tblkez% OR (tbuf_beg%=tbuf_end%)
  8228.     ~C:zeile%(1,L:vdi_par%,x%,y%,br%,0,0)
  8229.   ELSE
  8230.     IF i%=tblkaz% AND i%=tblkez% AND tblkes%<>0
  8231.       ~C:zeile%(1,L:vdi_par%,x%,y%,br%,tblkas%-txt_links%,tblkes%-txt_links%)
  8232.     ELSE
  8233.       IF i%=tblkaz%
  8234.         ~C:zeile%(1,L:vdi_par%,x%,y%,br%,tblkas%-txt_links%,br%)
  8235.       ELSE
  8236.         IF i%=tblkez% AND tblkes%<>0
  8237.           ~C:zeile%(1,L:vdi_par%,x%,y%,br%,1,tblkes%-txt_links%)
  8238.         ELSE
  8239.           IF i%>tblkaz% OR i%<tblkez%
  8240.             ~C:zeile%(1,L:vdi_par%,x%,y%,br%,1,br%)
  8241.           ENDIF
  8242.         ENDIF
  8243.       ENDIF
  8244.     ENDIF
  8245.   ENDIF
  8246.   '         Op, Strukt,  x-,y-,Spalten, first Revers, last Revers
  8247. RETURN
  8248. PROCEDURE wind_update(whdl&)
  8249.   .| Glob. Var.: nr%,wx&,wy&,wb&,wh&,desk.top%,ground&
  8250.   .| Felder    : wnr%()
  8251.   .| Ruft auf  : redraw_list
  8252.   .| Aufruf in : redraw-1,do_list-2,
  8253.   nr%=wnr%(whdl&)
  8254.   ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&)
  8255.   IF nr%=0
  8256.     ADD wy&,OB_H(desk.top%,ground&)
  8257.     SUB wh&,OB_H(desk.top%,ground&)
  8258.   ENDIF
  8259.   redraw_list(whdl&,wx&,wy&,wb&,wh&,0)
  8260. RETURN
  8261. PROCEDURE redraw(nr%)           ! Redraw von richtigen Fenster
  8262.   .| Felder    : whdl&()
  8263.   .| Ruft auf  : wind_update
  8264.   .| Aufruf in : wind_slide-6,wind_hslide-1,wind_vslide-1,hpage_l-1,hpage_r-1
  8265.   .|     wind_size-1,ctrl_h-2,scrollup-2,scrolldown-2,down-1,up-1,
  8266.   wind_update(whdl&(nr%))
  8267. RETURN
  8268. PROCEDURE do_list
  8269.   .| Felder    : whdl&()
  8270.   .| Ruft auf  : wind_update
  8271.   .| Aufruf in : hard_read-1,hard_command-1,hard_zero-1,clr_part-1
  8272.   .|     hard_save-1,hard_restore-1,hard_bad-1,get_root_info-1,unit_ready-1
  8273.   .|     hard_root-1,last_7-1,fdc_side-1,fdc_trkread-1,fdc_trackconfig-1
  8274.   .|     convert-1,anal_buf-1,gap-1,fdc_anal-1,fdc_diskanal-1
  8275.   .|     ram_adress_read-1,prg_load-1,do_undo-2,sektor_read-1
  8276.   .|     sektor_cluster-1,ph_side-1,sektor_physik_do-1,sektor_compare-1
  8277.   .|     set_block-1,txt_block-2,wind_dklick-1,set_w-1,out_do-2,disc_info-1
  8278.   .|     disc_save-1,disc_load-1,last_5-4,file_open-2,file_close-1
  8279.   .|     datei_cut-1,do_datei_info-2,dir_secsearch-1,dir_fldren-1,dir_root-1
  8280.   .|     last_12-1,maus_sort-2,to_blk_anf-1,to_blk_end-1,do_in-1,in_file-1
  8281.   .|     taste-2,control-1,alt_f-1,ctrl_a-1,ctrl_b-1,ctrl_c-1,ctrl_f-1
  8282.   .|     ctrl_g-1,ctrl_k-1,magic-1,set_list_offset-1,edit_ascii-3,top-1
  8283.   .|     lend-1,address-1,look_ex-1,set_found_block-1,floskel-1,opt_konfig-1
  8284.   .|     fat_xor-2,last_4-1,fat_read1-1,fat_read2-1,set_cursor_in_fat-1
  8285.   .|     cl_up-1,cl_down-1,test_suche-2,
  8286.   wind_update(whdl&(0))
  8287.   wind_update(whdl&(1))
  8288. RETURN
  8289. '
  8290. PROCEDURE info_line             ! nur Statuszeile ausgeben??
  8291.   .| Glob. Var.: box_draw%,wx&,wy&,wb&,wh&,desk.top%,ground&
  8292.   .| Felder    : whdl&()
  8293.   .| Ruft auf  : get_info,redraw_list
  8294.   .| Aufruf in : hard_ship-1,fdc_secread-1,fdc_null-2,analyse-1,schreiben-1
  8295.   .|     disc_check-4,file_open-1,last_10-1,do_file_open-1,alt_q-1,dec_hex-1
  8296.   .|     last_4-1,
  8297.   LOCAL whdl&
  8298.   IF box_draw%=0
  8299.     whdl&=whdl&(0)
  8300.     get_info(0)
  8301.     ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&)
  8302.     ADD wy&,OB_H(desk.top%,ground&)
  8303.     SUB wh&,OB_H(desk.top%,ground&)
  8304.     redraw_list(whdl&,wx&,wy&,wb&,wh&,2)
  8305.   ENDIF
  8306. RETURN
  8307. PROCEDURE set_desk
  8308.   .| Glob. Var.: wx&,wy&,wb&,wh&,desk.top%,ground&
  8309.   .| Felder    : whdl&()
  8310.   .| Aufruf in : wind_mess-1,redraw_desk-1,
  8311.   ~WIND_GET(whdl&(0),4,wx&,wy&,wb&,wh&)
  8312.   OB_X(desk.top%,ground&)=wx&
  8313.   OB_Y(desk.top%,ground&)=wy&
  8314.   OB_W(desk.top%,ground&)=wb&
  8315. RETURN
  8316. PROCEDURE redraw_desk(objc&)
  8317.   .| Glob. Var.: desk.top%,scr_handle%
  8318.   .| Felder    : whdl&()
  8319.   .| Ruft auf  : set_desk,vs_clip
  8320.   .| Aufruf in : rsc_init-1,set_button-1,clr_button-1,set_mod_button-1
  8321.   .|     set_kleine_buttons-1,redraw_list-1,
  8322.   LOCAL wgx&,wgy&,wgb&,wgh&,wb%,wh%,wx%,wy%,whdl&
  8323.   set_desk
  8324.   whdl&=whdl&(0)
  8325.   ~OBJC_OFFSET(desk.top%,objc&,wx%,wy%)
  8326.   wb%=OB_W(desk.top%,objc&)     ! Koordinaten des Objektes ermitteln,
  8327.   wh%=OB_H(desk.top%,objc&)+1   ! ab dem neu gezeichnet werden soll
  8328.   ~WIND_UPDATE(1)
  8329.   ~WIND_GET(whdl&,11,wgx&,wgy&,wgb&,wgh&)
  8330.   WHILE wgh&>0 AND wgb&>0
  8331.     IF RC_INTERSECT(wx%,wy%,wb%,wh%,wgx&,wgy&,wgb&,wgh&)=TRUE
  8332.       vs_clip(scr_handle%,1,wgx&,wgy&,wgb&,wgh&)
  8333.       ~OBJC_DRAW(desk.top%,objc&,8,wgx&,wgy&,wgb&,wgh&)
  8334.     ENDIF
  8335.     ~WIND_GET(whdl&,12,wgx&,wgy&,wgb&,wgh&)
  8336.   WEND
  8337.   ~WIND_UPDATE(0)
  8338.   vs_clip(scr_handle%,0,0,0,0,0)
  8339. RETURN
  8340. PROCEDURE scroll_right          ! Textfenster scrollen
  8341.   .| Glob. Var.: txt_links%,wx&,wy&,wb&,wh&,z.hoehe%
  8342.   .| Felder    : whdl&()
  8343.   .| Ruft auf  : redraw_list,set_slide
  8344.   .| Aufruf in : wind_slide-1,c_left-1,
  8345.   IF txt_links%>0
  8346.     txt_links%=MAX(0,txt_links%-1)
  8347.     ~WIND_GET(whdl&(1),4,wx&,wy&,wb&,wh&)
  8348.     redraw_list(whdl&(1),wx&,wy&+z.hoehe%,wb&,wh&-z.hoehe%,0)
  8349.     set_slide(whdl&(1))
  8350.   ENDIF
  8351. RETURN
  8352. PROCEDURE scroll_left           ! ...
  8353.   .| Glob. Var.: txt_links%,txt_breite%,wc%,wx&,wy&,wb&,wh&,z.hoehe%
  8354.   .| Felder    : whdl&()
  8355.   .| Ruft auf  : redraw_list,set_slide
  8356.   .| Aufruf in : wind_slide-1,c_right-1,edit_ascii-1,
  8357.   IF txt_links%<txt_breite%-wc%
  8358.     txt_links%=MIN(txt_links%+1,txt_breite%-wc%)
  8359.     ~WIND_GET(whdl&(1),4,wx&,wy&,wb&,wh&)
  8360.     redraw_list(whdl&(1),wx&,wy&+z.hoehe%,wb&,wh&-z.hoehe%,0)
  8361.     set_slide(whdl&(1))
  8362.   ENDIF
  8363. RETURN
  8364. ' ----------------------
  8365. ' disc_on: Auf Diskmodus umschalten
  8366. PROCEDURE disc_on
  8367.   .| Glob. Var.: mode%,d.isk%
  8368.   .| Ruft auf  : no_on,boot_sec,set_w
  8369.   .| Aufruf in : menu_2-1,last_5-1,dir_fldren-1,
  8370.   no_on
  8371.   mode%=d.isk%
  8372.   boot_sec !          Laufwerksinfo von Laufwerk drive% lesen
  8373.   set_w
  8374. RETURN
  8375. PROCEDURE file_on
  8376.   .| Glob. Var.: mode%,f.ile%,bps%,buf_size%,l_end%,file_open%,fl%,fi_o$
  8377.   .| Ruft auf  : no_on,set_aktpar,do_file_open,lesen,set_w
  8378.   .| Aufruf in : menu_1-1,
  8379.   no_on
  8380.   mode%=f.ile%
  8381.   bps%=buf_size%/2
  8382.   l_end%=bps%
  8383.   set_aktpar(0)
  8384.   IF file_open%<0
  8385.     CLR fl%
  8386.   ELSE
  8387.     IF file_open%=0
  8388.       do_file_open(fi_o$)
  8389.     ENDIF
  8390.   ENDIF
  8391.   lesen
  8392.   set_w
  8393. RETURN
  8394. PROCEDURE hard_on
  8395.   .| Glob. Var.: mode%,h.ard%
  8396.   .| Felder    : whdl&()
  8397.   .| Ruft auf  : no_on,do_mode_sense,wind_set,set_w
  8398.   .| Aufruf in : menu_4-1,
  8399.   no_on
  8400.   mode%=h.ard%
  8401.   do_mode_sense
  8402.   wind_set(whdl&(0))
  8403.   set_w
  8404. RETURN
  8405. PROCEDURE ram_on
  8406.   .| Glob. Var.: bps%,mode%,r.am%
  8407.   .| Ruft auf  : no_on,cbps,set_w
  8408.   .| Aufruf in : menu_3-1,
  8409.   no_on
  8410.   bps%=512
  8411.   cbps
  8412.   mode%=r.am%
  8413.   set_w
  8414. RETURN
  8415. PROCEDURE fdc_on
  8416.   .| Glob. Var.: mode%,f.dc%,l_end%,buf_size%,tpd%
  8417.   .| Ruft auf  : no_on,set_aktpar,set_w
  8418.   .| Aufruf in : menu_5-1,
  8419.   no_on
  8420.   mode%=f.dc%
  8421.   l_end%=buf_size%
  8422.   set_aktpar(0)
  8423.   tpd%=99
  8424.   set_w
  8425. RETURN
  8426. PROCEDURE set_w
  8427.   .| Glob. Var.: z%,wzb%,l_end%,set_w%
  8428.   .| Felder    : whdl&()
  8429.   .| Ruft auf  : set_slide,lesen,set_stat,do_list
  8430.   .| Aufruf in : disc_on-1,file_on-1,hard_on-1,ram_on-1,fdc_on-1,disc_drive-2
  8431.   .|     last_3-1,
  8432.   IF z%+wzb%>l_end%
  8433.     CLR z%
  8434.   ENDIF
  8435.   set_slide(whdl&(0))
  8436.   lesen
  8437.   INC set_w%
  8438.   IF set_w%>1
  8439.     set_stat
  8440.     do_list
  8441.   ENDIF
  8442. RETURN
  8443. PROCEDURE no_on
  8444.   .| Felder    : whdl&()
  8445.   .| Ruft auf  : file_is_open,clear_buf,wind_top
  8446.   .| Aufruf in : disc_on-1,file_on-1,hard_on-1,ram_on-1,fdc_on-1,
  8447.   file_is_open
  8448.   clear_buf(1)
  8449.   wind_top(whdl&(0))
  8450. RETURN
  8451. '
  8452. PROCEDURE clear_buf(a%)
  8453.   .| Glob. Var.: buf_size%,buf%,ak%
  8454.   .| Aufruf in : fdc_trackconfig-1,fdc_secread-1,gap-1,fdc_anal-1,no_on-1
  8455.   .|     disc_clear-1,file_open-1,file_close-1,datei_cut-1,datei_concat-1
  8456.   .|     do_file_open-1,init_ram-1,
  8457.   LOCAL a$
  8458.   a$=STRING$(buf_size%,0)
  8459.   BMOVE V:a$,buf%,buf_size%
  8460.   IF a%>0
  8461.     BMOVE V:a$,ak%,buf_size%
  8462.   ENDIF
  8463.   CLR a$
  8464. RETURN
  8465. PROCEDURE dum                 ! Für noch nicht implementierte Routinen
  8466.   .| Ruft auf  : maus_off
  8467.   .| Aufruf in : fdc_head-1,menu_mess-47,lies_all-1,maus_pos-3,einstellungen-1,
  8468.   maus_off
  8469. RETURN
  8470. PROCEDURE cbps
  8471.   .| Glob. Var.: bps%,l_end%
  8472.   .| Felder    : l_end%()
  8473.   .| Aufruf in : do_mode_sense-1,do_mode_select-1,ram_on-1,disc_info-2,
  8474.   IF bps%<512 OR bps%>8192
  8475.     bps%=512
  8476.   ENDIF
  8477.   l_end%(0)=bps%
  8478.   l_end%=bps%
  8479. RETURN
  8480. ' ----------------------
  8481. PROCEDURE stat_line(whdl&)    ! Statuszeile angeklickt
  8482.   .| Glob. Var.: ev_mx&,wind%,mode%,d.isk%,f.ile%,h.ard%,r.am%,f.dc%
  8483.   .| Felder    : wnr%()
  8484.   .| Ruft auf  : get_info,akt_find,sektor_read,sektor_cluster,ph_track,ph_sec
  8485.   .|     ph_side,disc_drive,show_status,dec_hex,file_name,hard_read,hard_unit
  8486.   .|     sh_hd_err,ram_adress_read,fdc_trkread,fdc_secread,fdc_side,fdc_drive
  8487.   .|     fdc_bytes,opt_ascii
  8488.   .| Aufruf in : message_auswerten-2,
  8489.   LOCAL akt%
  8490.   get_info(wnr%(whdl&))
  8491.   akt%=@akt_find(ev_mx&)
  8492.   IF wind%=0
  8493.     SELECT mode%
  8494.     CASE d.isk%
  8495.       ON akt% GOSUB sektor_read,sektor_cluster,ph_track,ph_sec,ph_side,disc_drive,show_status
  8496.     CASE f.ile%
  8497.       ON akt% GOSUB dec_hex,file_name,file_name
  8498.     CASE h.ard%
  8499.       ON akt% GOSUB hard_read,hard_unit,hard_unit,sh_hd_err,sh_hd_err,sh_hd_err,sh_hd_err
  8500.     CASE r.am%
  8501.       ON akt% GOSUB ram_adress_read
  8502.     CASE f.dc%
  8503.       ON akt% GOSUB fdc_trkread,fdc_secread,fdc_side,fdc_drive,fdc_bytes
  8504.     ENDSELECT
  8505.   ELSE
  8506.     opt_ascii
  8507.   ENDIF
  8508. RETURN
  8509. PROCEDURE clr_out(txt$)
  8510.   .| Glob. Var.: s.ammeln%
  8511.   .| Ruft auf  : do_clr_out,out
  8512.   .| Aufruf in : hard_statistik-1,hard_search-1,hard_bad-1,fdc_readadress-1
  8513.   .|     fdc_diskanal-1,fdc_trkinfo-1,ram_cookie-1,ram_test-1,disc_quick-1
  8514.   .|     disc_check-1,file_compare-1,datei_suchen-1,dir_sort-1,alt_q-1
  8515.   .|     info_system-1,info_fkey-1,info_kleine_buttons-1,info_platten-1
  8516.   .|     show_status-1,sh_hd_err-1,help-1,show_err_inf-1,do_ascii-1
  8517.   .|     fat_cluster-1,fat_optimum-1,disass-1,
  8518.   IF s.ammeln%=0
  8519.     do_clr_out(txt$)
  8520.   ELSE
  8521.     out(txt$)
  8522.   ENDIF
  8523. RETURN
  8524. PROCEDURE do_clr_out(txt$)
  8525.   .| Glob. Var.: sperr_txt%,out%,txt_breite%,top%,max.text%
  8526.   .| Felder    : l_end%(),out$(),whdl&()
  8527.   .| Ruft auf  : mtasse,set_slide,mnorm,out
  8528.   .| Aufruf in : hard_root-1,clr_out-1,file_repair-1,dir_files-1,opt_text-1
  8529.   .|     fat_graf_do-1,
  8530.   LOCAL i%
  8531.   IF sperr_txt%=0
  8532.     CLR out%,txt_breite%
  8533.     l_end%(1)=0
  8534.     top%=1
  8535.     mtasse
  8536.     FOR i%=0 TO max.text%  ! ERASE OUT$() funktioniert nicht --> 2 Bomben !!
  8537.       out$(i%)=""
  8538.     NEXT i%
  8539.     set_slide(whdl&(1))
  8540.     mnorm
  8541.     out(txt$)
  8542.   ENDIF
  8543. RETURN
  8544. PROCEDURE out_do
  8545.   .| Glob. Var.: last%,top%,out%,wz%,txt_breite%,txt_links%,erg%,s.ammeln%
  8546.   .|     wind%,hdl%
  8547.   .| Felder    : out$(),l_end%(),whdl&()
  8548.   .| Ruft auf  : set_slide,wind_top,do_list,out_sed,fwritec,look_ex
  8549.   .| Aufruf in : hard_statistik-1,hard_search-1,hard_bad-1,show_root-1
  8550.   .|     fdc_readadress-1,fdc_diskanal-1,fdc_trkinfo-1,ram_cookie-1
  8551.   .|     ram_test-1,ram_check-2,disc_quick-1,disc_check-1,file_repair-1
  8552.   .|     file_compare-1,datei_suchen-1,file_verify-1,pfad_compare-3
  8553.   .|     dir_files-1,dir_sort-1,alt_q-1,alt_t-1,info_system-1,info_fkey-1
  8554.   .|     info_kleine_buttons-1,info_platten-1,show_status-1,sh_hd_err-1
  8555.   .|     help-1,opt_text-1,do_save_text-1,show_err_inf-1,do_ascii-1
  8556.   .|     fat_cluster-1,fat_optimum-1,fat_graph-1,last_4-1,disass-1,
  8557.   LOCAL i%
  8558.   '
  8559.   CLR last%
  8560.   top%=MAX(1,top%)
  8561.   FOR i%=out% TO out%+wz%
  8562.     out$(i%)=""
  8563.   NEXT i%
  8564.   l_end%(1)=out%
  8565.   IF txt_breite%<txt_links%
  8566.     txt_links%=1
  8567.   ENDIF
  8568.   '
  8569.   IF erg%=3
  8570.     IF s.ammeln%<>0
  8571.       top%=MAX(1,out%-wz%)
  8572.     ENDIF
  8573.     set_slide(whdl&(1))
  8574.     IF wind%=0
  8575.       wind_top(whdl&(1))
  8576.       do_list
  8577.     ELSE
  8578.       do_list     ! muss sein, wegen MAGIX - Smart-Redraw
  8579.     ENDIF
  8580.   ELSE
  8581.     IF erg%=1 OR erg%=2
  8582.       out_sed(hdl%)
  8583.     ENDIF
  8584.     FOR i%=0 TO out%
  8585.       fwritec(hdl%,out$(i%))
  8586.     NEXT i%
  8587.     look_ex
  8588.   ENDIF
  8589. RETURN
  8590. PROCEDURE out(txt$)
  8591.   .| Glob. Var.: sperr_txt%,out%,txt_breite%,max.text%,wz%
  8592.   .| Felder    : out$()
  8593.   .| Aufruf in : search_cookie-1,hard_statistik-6,hard_search-1,hard_bad-3
  8594.   .|     inc_bad_err-1,hard_set_bad-1,unit_ready-10,hard_root-15,show_root-3
  8595.   .|     fdc_readadress-1,fdc_diskanal-1,fdc_do_info-5,ram_test-2,ram_check-5
  8596.   .|     clr_out-1,do_clr_out-1,disc_quick-1,disc_check-2,file_repair-1
  8597.   .|     lies_1-1,lies_3-1,file_verify-8,verify_out-1,pfad_compare-2
  8598.   .|     dir_files-4,dir_sort-1,control-2,alt_q-5,alt_t-1,edit_ascii-1
  8599.   .|     info_system-15,info_fkey-3,info_kleine_buttons-1,info_platten-5
  8600.   .|     show_status-1,sh_hd_err-2,help-2,show_err_inf-1,do_ascii-1
  8601.   .|     fat_cluster-2,fat_optimum-4,fat_graf_do-2,fat_get_defekt-2
  8602.   .|     temple_disass-1,sed_disass-2,
  8603.   IF sperr_txt%=0
  8604.     out$(out%)=txt$
  8605.     txt_breite%=MAX(txt_breite%,LEN(txt$))
  8606.     INC out%
  8607.     IF out%>max.text%-wz%
  8608.       out%=max.text%-wz%-1
  8609.     ENDIF
  8610.   ENDIF
  8611. RETURN
  8612. PROCEDURE set_last(a%)
  8613.   .| Glob. Var.: sperr_txt%,last%
  8614.   .| Ruft auf  : do_cursor_anz
  8615.   .| Aufruf in : hard_search-1,show_root-1,file_repair-1,file_compare-1
  8616.   .|     dir_files-1,dir_sort-1,info_fkey-1,info_kleine_buttons-1,fat_graph-1
  8617.   .|     last_4-1,
  8618.   IF sperr_txt%=0
  8619.     last%=a%
  8620.     do_cursor_anz(1)
  8621.   ENDIF
  8622. RETURN
  8623. PROCEDURE out_sed(hdl%)
  8624.   .| Glob. Var.: t.xtsavm%,ver$
  8625.   .| Ruft auf  : fwritec
  8626.   .| Aufruf in : out_do-1,sav_buf-1,sav_block-1,print_buf-1,print_blk-1,
  8627.   IF t.xtsavm%<>0
  8628.     fwritec(hdl%,ver$+":  "+DATE$+" "+TIME$)
  8629.   ENDIF
  8630. RETURN
  8631. '
  8632. PROCEDURE dat_lesen
  8633.   .| Glob. Var.: wind%
  8634.   .| Ruft auf  : in_file,opt_ascii
  8635.   .| Aufruf in : menu_mess-1,
  8636.   ON wind%+1 GOSUB in_file,opt_ascii
  8637. RETURN
  8638. PROCEDURE dat_sichern
  8639.   .| Glob. Var.: wind%,erg%
  8640.   .| Ruft auf  : schreiben,save_text
  8641.   .| Aufruf in : menu_mess-1,
  8642.   IF wind%=0
  8643.     schreiben
  8644.   ELSE
  8645.     erg%=1
  8646.     @save_text
  8647.   ENDIF
  8648. RETURN
  8649. PROCEDURE dat_sichern_als
  8650.   .| Glob. Var.: erg%,wind%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg%
  8651.   .| Ruft auf  : alrt,sav_buf,sav_block,save_text,save_block
  8652.   .| Aufruf in : menu_mess-1,
  8653.   LOCAL wwa%
  8654.   erg%=1
  8655.   IF wind%=0
  8656.     wwa%=1
  8657.     IF buf_end%>buf_beg%
  8658.       wwa%=@alrt(2,"Daten sichern ...",1,"Puffer|Block|Abbruch")
  8659.     ENDIF
  8660.     ON wwa% GOSUB sav_buf,sav_block
  8661.   ELSE
  8662.     wwa%=1
  8663.     IF tbuf_end%>tbuf_beg%
  8664.       wwa%=@alrt(2,"Textfenster sichern ...",1,"Puffer|Block|Abbruch")
  8665.     ENDIF
  8666.     ON wwa% GOSUB save_text,save_block
  8667.   ENDIF
  8668. RETURN
  8669. PROCEDURE dat_drucken
  8670.   .| Glob. Var.: erg%,wind%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg%
  8671.   .| Ruft auf  : alrt,print_buf,print_blk,print_text,print_block
  8672.   .| Aufruf in : menu_mess-1,
  8673.   LOCAL wwa%
  8674.   erg%=2
  8675.   IF wind%=0
  8676.     wwa%=1
  8677.     IF buf_end%>buf_beg%
  8678.       wwa%=@alrt(2,"Was drucken?",1,"Puffer|Block|Abbruch")
  8679.     ENDIF
  8680.     ON wwa% GOSUB print_buf,print_blk
  8681.   ELSE
  8682.     wwa%=1
  8683.     IF tbuf_end%>tbuf_beg%
  8684.       wwa%=@alrt(2,"Was aus dem Textfenster drucken?",1,"Puffer|Block|Abbruch")
  8685.     ENDIF
  8686.     ON wwa% GOSUB print_text,print_block
  8687.   ENDIF
  8688. RETURN
  8689. ' ---------------------- Proceduren für DISC -------------------
  8690. PROCEDURE disc_info
  8691.   .| Glob. Var.: lgs%,bstatus%,status%,bps%,buf%,bflag%,spd%,spc%,boot.dat%
  8692.   .|     bd1&,bd2&,bd3&,bd4&,bd5&,bd6&,chk_sum%,bd7&,bd8&,bd9&,serie%,i&,bp1&
  8693.   .|     bp2&,bp3&,len_dir%,bp4&,len_fat%,bp5&,bp6&,anf_dat%,bp7&,tpd%,drive%
  8694.   .|     n$,bde1&,bde2&,anf_fat2%,disc_name$,zg%,f$,att%,bdvolume&,bootget&
  8695.   .|     disk_defekt%,bootwr&,fil$,fhandle%,spf%,spt%,sid%,t%,b%
  8696.   .| Ruft auf  : boot_sec,readmot,alrt,cbps,put_wert,put_char,lesen,box_draw
  8697.   .|     form_do,clr_state,box_undraw,get_char$,schreiben,dsetdrv,dsetpath
  8698.   .|     nam_conv$,fcreate,fclose,get_val,put_in_bootsec,term$,media,err_inf
  8699.   .|     do_list
  8700.   .| Aufruf in : menu_mess-1,disc_drive-1,
  8701.   LOCAL a%,b#,bbps%,c%,ex_obj&,oldlgs%,t%,a$,b$,bb$
  8702.   '
  8703.   oldlgs%=lgs%
  8704.   boot_sec
  8705.   bstatus%=status%
  8706.   bb$=STRING$(bps%,0)           ! zum Bootsektor sichern
  8707.   BMOVE buf%,V:bb$,bps%
  8708.   '
  8709.   IF bstatus%=0
  8710.     c%=@readmot(22)             ! FAT-Größe
  8711.     IF (bflag% AND 1)<>0
  8712.       b#=2
  8713.     ELSE
  8714.       b#=1.5
  8715.     ENDIF
  8716.     bbps%=@readmot(11)
  8717.     t%=@readmot(19)                         ! Anzahl der Sektoren als Wort
  8718.     IF t%=0
  8719.       t%=SHL(@readmot(34),16)+@readmot(32)  ! Anzahl der Sektoren als Langwort
  8720.     ENDIF
  8721.     a%=(t%-@readmot(14)-BYTE{buf%+16}*c%-@readmot(17)*32/bbps%)/BYTE{buf%+13}+2  ! benötigte FAT-Einträge
  8722.     a%=(a%*b#+bbps%-1)/bbps%  ! benötigte FAT-Sektoren
  8723.     IF c%<a%                 ! reichen die FAT-Sektoren?
  8724.       ~@alrt(3,"FAT-Größe im Bootsektor zu klein!!! |Muß "+STR$(a%)+" Sektoren|groß sein!",1," Aha ")
  8725.     ENDIF
  8726.   ENDIF
  8727.   cbps
  8728.   '
  8729.   ' Daten aus dem Bootsektor
  8730.   IF bstatus%=0
  8731.     put_wert(boot.dat%,bd1&,@readmot(11),4)
  8732.     put_wert(boot.dat%,bd2&,BYTE{buf%+13},4)
  8733.     put_wert(boot.dat%,bd3&,@readmot(17),4)
  8734.     put_wert(boot.dat%,bd4&,@readmot(22),4)
  8735.     put_wert(boot.dat%,bd5&,t%,7)
  8736.     put_char(boot.dat%,bd6&,HEX$(chk_sum%,4))
  8737.     put_wert(boot.dat%,bd7&,@readmot(24),4)
  8738.     put_wert(boot.dat%,bd8&,@readmot(26),4)
  8739.     put_wert(boot.dat%,bd9&,serie%,8)
  8740.   ELSE
  8741.     FOR i&=bd1& TO bd9&
  8742.       put_char(boot.dat%,i&,"")
  8743.     NEXT i&
  8744.   ENDIF
  8745.   '
  8746.   ' Daten vom BIOSPARAMETERBLOCK
  8747.   put_char(boot.dat%,bp1&,STR$(bps%))
  8748.   put_char(boot.dat%,bp2&,STR$(spc%))
  8749.   put_char(boot.dat%,bp3&,STR$(len_dir%*(bps%/32)))
  8750.   put_char(boot.dat%,bp4&,STR$(len_fat%))
  8751.   put_char(boot.dat%,bp5&,STR$(spd%))
  8752.   put_wert(boot.dat%,bp6&,anf_dat%,4)
  8753.   put_wert(boot.dat%,bp7&,tpd%,4)
  8754.   '
  8755.   ' sonstige INFOS
  8756.   a%=DFREE(drive%+1)
  8757.   a$=RIGHT$(n$+STR$(spd%*bps%-a%),9)
  8758.   put_char(boot.dat%,bde1&,a$)          ! belegt?
  8759.   a$=RIGHT$(n$+STR$(a%),9)
  8760.   put_char(boot.dat%,bde2&,a$)          ! frei
  8761.   '
  8762.   lgs%=anf_dir%                         ! Anfang Directory
  8763.   lesen                                 ! Sektor holen
  8764.   CLR disc_name$,zg%                    ! ab Anfang suchen
  8765.   DO
  8766.     CLR f$
  8767.     EXIT IF BYTE{buf%+zg%}=0 OR lgs%>=anf_dat%
  8768.     f$=STRING$(11,0)
  8769.     BMOVE buf%+zg%,V:f$,11              ! sonst Filennamen holen
  8770.     att%=BYTE{buf%+zg%+11}              ! und   Attribut   holen
  8771.     EXIT IF (att% AND 8)=8
  8772.     ADD zg%,32                          ! Wenn nicht Diskname
  8773.     IF zg%>=bps%
  8774.       INC lgs%                          ! Wenn Wurzelverzeichnis > 1 Sektor
  8775.       lesen                             ! nächsten Sektor holen
  8776.       CLR zg%                           ! und wieder ab Anfang
  8777.     ENDIF
  8778.   LOOP
  8779.   disc_name$=f$                         ! Name merken
  8780.   put_char(boot.dat%,bdvolume&,disc_name$)
  8781.   ' ---------------------------------------
  8782.   DO
  8783.     box_draw(boot.dat%)
  8784.     ex_obj&=@form_do(boot.dat%) AND &HFF
  8785.     clr_state(boot.dat%,ex_obj&,1)
  8786.     box_undraw(boot.dat%)
  8787.     EXIT IF ex_obj&<>bde1&                                      ! <<<< neu
  8788.     ~@alrt(1,"Auch eine leeres Laufwerk belegt |FAT+Directory!",1," Aha ")
  8789.   LOOP
  8790.   '
  8791.   IF ex_obj&=bootget& AND drive%<2
  8792.     disk_defekt%=1
  8793.   ELSE
  8794.     disk_defekt%=0
  8795.   ENDIF
  8796.   '
  8797.   IF ex_obj&=bootwr& OR ex_obj&=bootget&
  8798.     '
  8799.     IF ex_obj&=bootwr&
  8800.       b$=@get_char$(boot.dat%,bdvolume&) ! Volumelabel
  8801.       IF b$<>disc_name$
  8802.         IF LEN(disc_name$)>0            ! Wenn was gefunden war
  8803.           IF LEN(b$)>0
  8804.             b$=LEFT$(b$+STRING$(11,32),11)
  8805.             BMOVE V:b$,buf%+zg%,11      ! dann neuen Namen schreiben
  8806.           ELSE
  8807.             b$=CHR$(&HE5)+STRING$(31,0) ! Eintrag löschen
  8808.             BMOVE V:b$,buf%+zg%,32      ! dann neuen Namen schreiben
  8809.           ENDIF
  8810.           schreiben
  8811.         ELSE
  8812.           IF LEN(b$)>0
  8813.             REPEAT  ! Pseudoschleife
  8814.               EXIT IF @dsetdrv(drive%)<0
  8815.               EXIT IF @dsetpath("\")<0
  8816.               fil$=@nam_conv$(b$,0)
  8817.               fhandle%=@fcreate(fil$,8)
  8818.               EXIT IF fhandle%<0
  8819.               ~@fclose(fhandle%)
  8820.             UNTIL 1
  8821.           ENDIF
  8822.         ENDIF
  8823.       ENDIF
  8824.     ENDIF
  8825.     ' ----------------------------------
  8826.     IF bstatus%=0 OR ex_obj&=bootget&
  8827.       BMOVE V:bb$,buf%,LEN(bb$)         ! Bootsektor zurück in Puffer
  8828.       IF drive%<2
  8829.         a%=@get_val(boot.dat%,bd9&)     ! Serie
  8830.         CARD{buf%+8}=(a% AND &HFFFF00) DIV 256
  8831.         BYTE{buf%+10}=a% AND &HFF
  8832.       ENDIF
  8833.       bps%=@get_val(boot.dat%,bd1&)     ! BPS
  8834.       put_in_bootsec(11,bps%)
  8835.       cbps
  8836.       spc%=@get_val(boot.dat%,bd2&)     ! SPC
  8837.       BYTE{buf%+13}=spc% AND &HFF
  8838.       a%=@get_val(boot.dat%,bd3&)       ! ROOT
  8839.       put_in_bootsec(17,a%)
  8840.       spd%=@get_val(boot.dat%,bd5&)     ! SPD
  8841.       IF spd%<&H10000                   !RS: Langwortversion von readmot/put_in_bootsec?
  8842.         put_in_bootsec(19,spd%)         ! Anzahl der Sektoren als Wort
  8843.       ELSE
  8844.         put_in_bootsec(19,0)
  8845.         put_in_bootsec(32,spd% AND &HFFFF) ! Anzahl der Sektoren als Langwort
  8846.         put_in_bootsec(34,SHR(spd%,16))
  8847.       ENDIF
  8848.       spf%=@get_val(boot.dat%,bd4&)     ! SPF
  8849.       put_in_bootsec(22,spf%)
  8850.       spt%=@get_val(boot.dat%,bd7&)     ! SPT
  8851.       put_in_bootsec(24,spt%)
  8852.       sid%=@get_val(boot.dat%,bd8&)     ! Seiten
  8853.       put_in_bootsec(26,sid%)
  8854.       anf_dat%=@get_val(boot.dat%,bp6&) ! 1. Datensektor
  8855.       tpd%=@get_val(boot.dat%,bp7&)     ! TPD
  8856.       '
  8857.       CLR c%                            ! Checksum generieren
  8858.       FOR t%=0 TO 254
  8859.         ADD c%,CARD{buf%+t%*2}
  8860.       NEXT t%
  8861.       c%=c% AND &HFFFF
  8862.       a$=@get_char$(boot.dat%,bd6&)
  8863.       a%=VAL("$"+a$)
  8864.       b%=(a%-c%) AND &HFFFF
  8865.       BYTE{buf%+510}=b% DIV 256
  8866.       BYTE{buf%+511}=b% AND &HFF
  8867.       '
  8868.       CLR lgs%
  8869.       IF ex_obj&=bootwr&
  8870.         IF @media(drive%)=0
  8871.           status%=BIOS(4,1,L:buf%,1,lgs%,drive%)
  8872.           IF status%=-14
  8873.             status%=BIOS(4,1,L:buf%,1,lgs%,drive%)
  8874.           ENDIF
  8875.           err_inf(status%)
  8876.         ELSE
  8877.           err_inf(-1)
  8878.         ENDIF
  8879.       ENDIF
  8880.     ENDIF
  8881.   ENDIF
  8882.   lgs%=oldlgs%
  8883.   lesen
  8884.   do_list
  8885. RETURN
  8886. FUNCTION readintel(wo%)
  8887.   .| Glob. Var.: buf%
  8888.   .| Aufruf in : do_mark_bad-4,
  8889.   RETURN 256*BYTE{buf%+wo%}+BYTE{buf%+wo%-1}
  8890. ENDFUNC
  8891. FUNCTION readmot(wo%)
  8892.   .| Glob. Var.: buf%
  8893.   .| Aufruf in : clr_part-3,disc_info-8,
  8894.   RETURN BYTE{buf%+wo%}+256*BYTE{buf%+wo%+1}
  8895. ENDFUNC
  8896. PROCEDURE put_in_bootsec(wo%,was%)
  8897.   .| Glob. Var.: buf%
  8898.   .| Aufruf in : disc_info-6,
  8899.   BYTE{buf%+wo%}=was% AND &HFF
  8900.   BYTE{buf%+wo%+1}=(was% AND &HFF00)/&H100
  8901. RETURN
  8902. PROCEDURE boot_sec
  8903.   .| Glob. Var.: tpd%,drive%,bpb%,lgs%,status%,buf%,fat_anz%,chk_sum%,bflag%
  8904.   .|     ed%,spt%,spd%,cpd%,spc%,anf_dat%,bps%,buf_size%,chk_ofls%,a&
  8905.   .| Felder    : whdl&()
  8906.   .| Ruft auf  : bios_block,mdisk,err_inf,chk_sum,set_crcbuf,default_bootsec
  8907.   .|     alrt,boot_wrong,set_slide,ofls,boot_sec
  8908.   .| Aufruf in : HAUPTPROGRAMM-1,chk_drv-1,sektor_compare-3,disc_on-1
  8909.   .|     disc_info-1,boot_sec-1,disc_drive-1,floppy_param-1,
  8910.   CLR tpd%
  8911.   '
  8912.   bios_block(drive%)
  8913.   IF bpb%>=0
  8914.     CLR lgs%
  8915.     mdisk
  8916.     status%=BIOS(4,0,L:buf%,1,0,drive%) ! BOOT-Sektor lesen
  8917.     IF status%=-14
  8918.       status%=BIOS(4,0,L:buf%,1,0,drive%)
  8919.     ENDIF
  8920.     fat_anz%=BYTE{buf%+16}
  8921.     err_inf(status%)
  8922.     chk_sum%=@chk_sum
  8923.     set_crcbuf
  8924.     IF bpb%=0
  8925.       default_bootsec
  8926.       status%=-7
  8927.       ~@alrt(3,"Kein BIOS-Parameterblock!|Setze Standardwerte ein, |sonst SYSTEM-CRASH!",0," Ok ")
  8928.       err_inf(status%)
  8929.     ELSE
  8930.       IF (bflag% AND 1)=0
  8931.         ed%=&HFFF
  8932.       ELSE
  8933.         ed%=&HFFFF
  8934.       ENDIF
  8935.       IF drive%<2
  8936.         IF spt%=0
  8937.           spt%=9
  8938.           boot_wrong("Tracks = 0")
  8939.         ENDIF
  8940.       ELSE
  8941.         spd%=cpd%*spc%+anf_dat%
  8942.       ENDIF
  8943.     ENDIF
  8944.     IF spc%=0
  8945.       spc%=2
  8946.       boot_wrong("Sektoren/Cluster = 0")
  8947.     ENDIF
  8948.     IF spd%=0
  8949.       spd%=1440
  8950.       boot_wrong("Sektoren/Disk = 0")
  8951.     ENDIF
  8952.     IF bps%>buf_size% OR bps%<=0
  8953.       bps%=512
  8954.       boot_wrong("max. "+STR$(buf_size%)+" Bytes/Sektor")
  8955.     ENDIF
  8956.     set_slide(whdl&(0))
  8957.   ELSE
  8958.     IF chk_ofls%>0        ! Zeiger auf Struktur "OFLS", ver, data ...
  8959.       a&=@ofls(drive%)    ! OFLS lesen
  8960.       IF a&>0 AND a&<>&HFFFF
  8961.         drive%=0
  8962.         boot_sec
  8963.       ENDIF
  8964.     ENDIF
  8965.   ENDIF
  8966. RETURN
  8967. PROCEDURE boot_wrong(a$)
  8968.   .| Ruft auf  : alrt
  8969.   .| Aufruf in : boot_sec-4,
  8970.   ~@alrt(3,"Bootsektordaten ungültig:|"+a$,1,"So was")
  8971. RETURN
  8972. PROCEDURE default_bootsec
  8973.   .| Glob. Var.: tpd%,sid%,spt%,spc%,spf%,spd%,hid%
  8974.   .| Aufruf in : HAUPTPROGRAMM-1,boot_sec-1,
  8975.   tpd%=80
  8976.   sid%=1
  8977.   spt%=9
  8978.   spc%=2
  8979.   spf%=5
  8980.   spd%=spt%*sid%*tpd%
  8981.   CLR hid%
  8982. RETURN
  8983. '
  8984. PROCEDURE disc_clear
  8985.   .| Glob. Var.: drive%,cpd%,spc%,wa$,spd%,len_fat%,len_dir%,b.ox%,boxaktiv&
  8986.   .|     boxtxt&,status%,lgs%,n$,buf%
  8987.   .| Ruft auf  : alrt,clear_buf,put_char,box_draw,media,objc_update,was_ist
  8988.   .|     err_inf,fat_clr,write_fat,box_undraw,lesen,mnorm
  8989.   .| Aufruf in : menu_mess-1,
  8990.   LOCAL a$,start%,wwa%
  8991.   '
  8992.   a$="ACHTUNG:|Laufwerk "+CHR$(drive%+65)+" mit|"+STR$(spd%)+" Sektoren wird gelöscht!"
  8993.   IF @alrt(2,a$,0,wa$)=1
  8994.     clear_buf(1)
  8995.     wwa%=@alrt(2,a$,0,"Alles|DIR+FAT|Abbruch")
  8996.     IF wwa%<3
  8997.       IF wwa%=1
  8998.         start%=spd%
  8999.         a$="Lösche Laufwerk "+CHR$(drive%+65)
  9000.       ELSE
  9001.         start%=anf_dat%
  9002.         a$="Lösche FAT+DIR auf Laufwerk "+CHR$(drive%+65)
  9003.       ENDIF
  9004.       put_char(b.ox%,boxaktiv&," ")
  9005.       put_char(b.ox%,boxtxt&,a$)
  9006.       box_draw(b.ox%)
  9007.       '
  9008.       IF @media(drive%)<0
  9009.         status%=-1
  9010.       ELSE
  9011.         FOR lgs%=start%-2 TO anf_dir% STEP -2
  9012.           a$="Sektor: "+RIGHT$(n$+STR$(lgs%),5)
  9013.           put_char(b.ox%,boxaktiv&,a$)
  9014.           objc_update(b.ox%,boxaktiv&)
  9015.           EXIT IF @was_ist>0
  9016.           status%=@rwabs(1,buf%,2,lgs%,drive%)
  9017.           EXIT IF status%<0
  9018.         NEXT lgs%
  9019.         lgs%=anf_dir%
  9020.         IF status%=0
  9021.           status%=@rwabs(1,buf%,1,lgs%,drive%)
  9022.         ENDIF
  9023.         a$="FAT löschen"
  9024.         put_char(b.ox%,boxaktiv&,a$)
  9025.         objc_update(b.ox%,boxaktiv&)
  9026.         err_inf(status%)
  9027.         fat_clr
  9028.         write_fat
  9029.       ENDIF
  9030.       box_undraw(b.ox%)
  9031.     ENDIF
  9032.     lesen
  9033.   ENDIF
  9034.   mnorm
  9035. RETURN
  9036. '
  9037. PROCEDURE disc_save
  9038.   .| Glob. Var.: erg%,drive%,pfad$,device%,fd$,lgs%,len_fat%,len_dir%,hdl%
  9039.   .|     buf%,bps%,fehler%,spd%
  9040.   .| Ruft auf  : dev,lesen,do_list,fwrite2,alrt,look_ex
  9041.   .| Aufruf in : menu_mess-1,
  9042.   LOCAL a%
  9043.   erg%=1
  9044.   IF drive%<>0
  9045.     pfad$="A:\"
  9046.   ELSE
  9047.     pfad$="B:\"
  9048.   ENDIF
  9049.   dev("FAT/DIR sichern",33)
  9050.   IF device%<>99
  9051.     IF (ASC(fd$)-65)<>drive%
  9052.       FOR lgs%=0 TO anf_dat%-1
  9053.         lesen
  9054.         ' do_list  ! dauert zu lange
  9055.         fwrite2(hdl%,buf%,bps%)
  9056.         IF fehler%<0
  9057.           lgs%=spd%-2
  9058.         ENDIF
  9059.       NEXT lgs%
  9060.     ELSE
  9061.       ~@alrt(3,"Bitte nicht auf|dasselbe Laufwerk! | DISK-SAVE!",3," Ok ")
  9062.     ENDIF
  9063.     look_ex
  9064.   ENDIF
  9065. RETURN
  9066. PROCEDURE disc_load
  9067.   .| Glob. Var.: fi$,drive%,fhandle%,bps%,buf%,fehler%,lgs%,hdl%
  9068.   .| Ruft auf  : fsel$,media,fopen,fseek,fread2,do_list,schreiben,fclose
  9069.   .| Aufruf in : menu_mess-1,
  9070.   LOCAL ab%,i%,fl%
  9071.   fi$=@fsel$("*.DAT","SAVE_"+CHR$(drive%+65)+".DAT","Disk-Load",5)
  9072.   IF EXIST(fi$)=TRUE
  9073.     IF @media(drive%)=0
  9074.       fhandle%=@fopen(fi$,0)    ! Datei öffnen
  9075.       IF fhandle%>=0
  9076.         fl%=@fseek(0,fhandle%,2)
  9077.         ~@fseek(0,fhandle%,0)   ! Offset 0
  9078.         ab%=INT(fl%/bps%)-1
  9079.         FOR i%=0 TO ab%
  9080.           fread2(fhandle%,buf%,bps%)
  9081.           IF fehler%<0
  9082.             i%=ab%+1
  9083.           ENDIF
  9084.           do_list
  9085.           lgs%=i%
  9086.           schreiben
  9087.         NEXT i%
  9088.         ~@fclose(hdl%)
  9089.       ENDIF
  9090.     ENDIF
  9091.   ENDIF
  9092. RETURN
  9093. '
  9094. PROCEDURE disc_quick    ! Dateiliste per GEMDOS
  9095.   .| Glob. Var.: erg%,drive%,fi$,dta$,dta%,alle%,lies_mode%
  9096.   .| Ruft auf  : change_pfad,fsel$,clr_out,fgetdta,mtasse,lies_all,out,out_do
  9097.   .| Aufruf in : menu_mess-1,
  9098.   erg%=3
  9099.   change_pfad(6,drive%)
  9100.   fi$=@fsel$("*.*","","Pfad für Dateiliste...",6)
  9101.   IF fi$<>""
  9102.     clr_out(fi$+"*.*")
  9103.     dta$=STRING$(44,0)
  9104.     dta%=@fgetdta
  9105.     mtasse
  9106.     CLR alle%
  9107.     lies_mode%=1
  9108.     lies_all(fi$)
  9109.     out(STR$(alle%)+" Dateien")
  9110.     out_do
  9111.   ENDIF
  9112. RETURN
  9113. PROCEDURE disc_check    ! alle Sektoren lesen eines Laufwerks
  9114.   .| Glob. Var.: drive%,wa$,erg%,spt%,bps%,buf%,lgs%,spd%,status%,sektor%
  9115.   .|     track%,seite%,s.lider%
  9116.   .| Felder    : whdl&()
  9117.   .| Ruft auf  : alrt,clr_out,mtasse,fat_get_defekt,out,wind_top,was_ist
  9118.   .|     info_line,mdisk,disc_check_err,set_slide,write_fat,floppy_param,lesen
  9119.   .|     out_do,mnorm
  9120.   .| Aufruf in : menu_mess-1,
  9121.   LOCAL a1%,a2%,anz%,b%,cl%,a$
  9122.   '
  9123.   a$="Laufwerk "+CHR$(drive%+65)+":  prüfen"
  9124.   IF @alrt(2,a$+"?",1,wa$)=1
  9125.     erg%=3
  9126.     clr_out(a$)
  9127.     mtasse
  9128.     anz%=@fat_get_defekt
  9129.     out("Anzahl der Defekte davor: "+STR$(anz%))
  9130.     IF drive%<2
  9131.       a1%=spt%
  9132.     ELSE
  9133.       a1%=68
  9134.     ENDIF
  9135.     a2%=MALLOC(a1%*bps%)
  9136.     IF a2%=0
  9137.       a1%=1
  9138.       a2%=buf%
  9139.     ENDIF
  9140.     wind_top(whdl&(0))
  9141.     DO
  9142.       EXIT IF @was_ist>0 OR lgs%>=spd%
  9143.       a1%=MIN(a1%,spd%-lgs%)
  9144.       IF drive%<2
  9145.         info_line     ! muss rein wegen Umrechnung LGS-  sektor ....
  9146.         mdisk
  9147.         status%=XBIOS(8,L:a2%,L:0,drive%,sektor%,track%,seite%,a1%)
  9148.         IF status%<0
  9149.           FOR lgs%=lgs% TO lgs%+a1%-1
  9150.             EXIT IF @was_ist>0
  9151.             info_line
  9152.             status%=XBIOS(8,L:buf%,L:0,drive%,sektor%,track%,seite%,1)
  9153.             IF status%<0
  9154.               disc_check_err(lgs%)
  9155.             ENDIF
  9156.           NEXT lgs%
  9157.         ENDIF
  9158.       ELSE
  9159.         info_line
  9160.         mdisk
  9161.         status%=@rwabs(2,a2%,a1%,lgs%,drive%)
  9162.         IF status%<0
  9163.           FOR lgs%=lgs% TO lgs%+a1%-1
  9164.             EXIT IF @was_ist>0
  9165.             info_line
  9166.             status%=@rwabs(2,buf%,1,lgs%,drive%)
  9167.             IF status%<0
  9168.               disc_check_err(lgs%)
  9169.             ENDIF
  9170.           NEXT lgs%
  9171.         ENDIF
  9172.       ENDIF
  9173.       IF s.lider%>0
  9174.         set_slide(whdl&(0))
  9175.       ENDIF
  9176.       ADD lgs%,a1%
  9177.     LOOP
  9178.     IF b%>0
  9179.       IF @alrt(2,STR$(b%)+" defekte Sektoren gefunden! | FAT schreiben?",0,wa$)=1
  9180.         write_fat
  9181.       ELSE
  9182.         floppy_param
  9183.       ENDIF
  9184.     ENDIF
  9185.     IF a1%>1  ! Wurde Puffer per Malloc() reserviert?
  9186.       ~MFREE(a2%)
  9187.     ENDIF
  9188.     IF lgs%>=spd%
  9189.       CLR lgs%
  9190.     ENDIF
  9191.     lesen
  9192.     out("Anzahl der neuen Defekte: "+STR$(b%))
  9193.     out_do
  9194.   ENDIF
  9195.   mnorm
  9196. RETURN
  9197. PROCEDURE disc_check_err(a%)
  9198.   .| Glob. Var.: status%,anf_dat%,spc%,b%
  9199.   .| Ruft auf  : err_inf,write_in_fat
  9200.   .| Aufruf in : disc_check-2,
  9201.   LOCAL cl%
  9202.   err_inf(status%)
  9203.   cl%=INT((a%-anf_dat%)/spc%)+2
  9204.   IF cl%>=2
  9205.     write_in_fat(&HFFF7,cl%)
  9206.     INC b%
  9207.   ENDIF
  9208. RETURN
  9209. PROCEDURE disc_drive    ! Laufwerk wechseln
  9210.   .| Glob. Var.: drv_map%,drive%,disk_defekt%,l1&,d.rives%,driabb&,last%,bpb%
  9211.   .|     pfad$,status%
  9212.   .| Felder    : whdl&()
  9213.   .| Ruft auf  : change,dsetdrv,set_flags,clr_state,clr_flags,set_state
  9214.   .|     box_draw,form_do,box_undraw,boot_sec,alrt,disc_info,set_w,wind_set
  9215.   .| Aufruf in : stat_line-1,
  9216.   LOCAL a&,di%,i%,j%,old%,oldlgs%,ex_obj&
  9217.   '
  9218.   change
  9219.   drv_map%=@dsetdrv(drive%)
  9220.   '
  9221.   CLR disk_defekt%
  9222.   FOR i%=0 TO 25
  9223.     j%=l1&+i%
  9224.     IF (drv_map% AND 2^i%)<>0
  9225.       set_flags(d.rives%,j%,1)  ! SELECTABLE
  9226.       clr_state(d.rives%,j%,8)  ! DISABLED
  9227.     ELSE
  9228.       clr_flags(d.rives%,j%,1)
  9229.       set_state(d.rives%,j%,8)
  9230.     ENDIF
  9231.   NEXT i%
  9232.   set_state(d.rives%,l1&+drive%,1)
  9233.   box_draw(d.rives%)
  9234.   ex_obj&=@form_do(d.rives%) AND &HFF
  9235.   box_undraw(d.rives%)
  9236.   clr_state(d.rives%,ex_obj&,1)
  9237.   IF ex_obj&<>driabb&
  9238.     di%=ex_obj&-l1&
  9239.     IF di%>=0 AND (drv_map% AND 2^di%)
  9240.       old%=drive%
  9241.       drive%=di%
  9242.       CLR last%
  9243.       boot_sec
  9244.       IF bpb%>0
  9245.         pfad$=CHR$(drive%+65)+":\"
  9246.       ELSE
  9247.         IF bpb%=0
  9248.           IF @alrt(2,"Kein BIOS-Parameterblock |von Laufwerk "+CHR$(drive%+65)+": ",1,"Wechseln|Abbruch")=2
  9249.             drive%=old%
  9250.             CLR status%
  9251.           ELSE
  9252.             disc_info
  9253.             set_w
  9254.           ENDIF
  9255.         ELSE
  9256.           drive%=old%
  9257.         ENDIF
  9258.       ENDIF
  9259.     ENDIF
  9260.   ENDIF
  9261.   wind_set(whdl&(0))
  9262.   set_w
  9263. RETURN
  9264. '
  9265. PROCEDURE file_repair
  9266.   .| Glob. Var.: srep%,abb%,erg%,total%,a$,wc%
  9267.   .| Felder    : file$(),cluster%(),att%(),laenge%()
  9268.   .| Ruft auf  : find_files,do_clr_out,out,out_do,set_last,alrt
  9269.   .| Aufruf in : menu_mess-1,
  9270.   LOCAL j%,i%
  9271.   srep%=1
  9272.   find_files
  9273.   CLR srep%,j%
  9274.   IF abb%=0
  9275.     erg%=3
  9276.     do_clr_out("Name"+SPACE$(38)+"Cluster Attribut  Länge")
  9277.     FOR i%=1 TO total%
  9278.       a$=RIGHT$(file$(i%),LEN(file$(i%))-RINSTR(file$(i%),"\"))
  9279.       IF ASC(a$)=&HE5
  9280.         INC j%
  9281.         a$=@pfad_format$(file$(i%),42)
  9282.         a$=LEFT$(a$+SPACE$(wc%),wc%)
  9283.         MID$(a$,44)=STR$(cluster%(i%))
  9284.         MID$(a$,51)=BIN$(att%(i%),8)
  9285.         MID$(a$,61)=STR$(laenge%(i%))
  9286.         out(a$)
  9287.       ENDIF
  9288.     NEXT i%
  9289.   ENDIF
  9290.   IF j%>0
  9291.     out_do
  9292.     set_last(5)
  9293.   ELSE
  9294.     IF abb%=0
  9295.       ~@alrt(3,"Keine gelöschten Dateien.",1,"Abbruch")
  9296.     ENDIF
  9297.   ENDIF
  9298. RETURN
  9299. PROCEDURE last_5
  9300.   .| Glob. Var.: total%,txt_zeile%,top%,kaputt$,bps%,spc%,lgs%,anf_dat%,spd%
  9301.   .|     sch%,foc%,dmt%,cpd%,rrg%,ddd%,dv%,ed%,sektor%,status%,drive%
  9302.   .| Felder    : file$(),whdl&(),laenge%(),cluster%(),att%(),sec%(),out$()
  9303.   .| Ruft auf  : disc_on,wind_top,lesen,do_list,read_in_fat,alrt,write_in_fat
  9304.   .|     write_fat,nam_conv$,einname,media,err_inf,bios_block
  9305.   .| Aufruf in : maus_pos-1,
  9306.   LOCAL aa%,bac%,cl%,cpf#,cpf%,ay%,i%,j%,sf%,witch%,repair%
  9307.   LOCAL a$,bb$,f$,s$
  9308.   '
  9309.   CLR ay%
  9310.   FOR i%=1 TO total%
  9311.     a$=RIGHT$(file$(i%),LEN(file$(i%))-RINSTR(file$(i%),"\"))
  9312.     IF ASC(a$)=&HE5
  9313.       INC ay%
  9314.       IF ay%=txt_zeile%+top%
  9315.         j%=i%
  9316.         witch%=txt_zeile%+top%
  9317.         i%=total%
  9318.       ENDIF
  9319.     ENDIF
  9320.   NEXT i%
  9321.   sf%=j%
  9322.   CLR repair%
  9323.   disc_on
  9324.   '
  9325.   IF sf%<=total% AND sf%>0
  9326.     DO
  9327.       wind_top(whdl&(0))
  9328.       '
  9329.       kaputt$=RIGHT$(file$(sf%),LEN(file$(sf%))-RINSTR(file$(sf%),"\"))
  9330.       cpf#=laenge%(sf%)/(bps%*spc%)    ! Cluster pro File
  9331.       IF cpf#<>INT(cpf#)
  9332.         INC cpf#
  9333.       ENDIF
  9334.       cpf%=cpf#
  9335.       bac%=cluster%(sf%)
  9336.       lgs%=(bac%-2)*spc%+anf_dat%
  9337.       IF lgs%<spd%
  9338.         lesen
  9339.       ENDIF
  9340.       do_list
  9341.       '
  9342.       aa%=@read_in_fat(bac%)
  9343.       IF aa%>0
  9344.         sch%=@alrt(2,"Cluster ist nicht frei. ",1,"Abbruch")
  9345.       ENDIF
  9346.       EXIT IF aa%>0
  9347.       '
  9348.       foc%=bac%
  9349.       dmt%=@alrt(2,"Repair ohne Rückfragen?",1," Ohne |Mit")
  9350.       '
  9351.       DO
  9352.         bac%=foc%
  9353.         DO
  9354.           EXIT IF bac%>=cpd%+2
  9355.           lgs%=(bac%-2)*spc%+anf_dat%
  9356.           rrg%=1
  9357.           IF dmt%=2
  9358.             lesen
  9359.             do_list
  9360.             ddd%=@alrt(2,"Nächsten Sektor sehen? ",1,"Ja|Nein|Abbruch")
  9361.             IF ddd%=1
  9362.               INC lgs%
  9363.               lesen
  9364.               do_list
  9365.               '
  9366.               DEC lgs%
  9367.               lesen
  9368.             ENDIF
  9369.             IF ddd%=3
  9370.               rrg%=4
  9371.             ENDIF
  9372.             EXIT IF rrg%=4
  9373.             '
  9374.             rrg%=@alrt(2,"Ist dies die |gesuchte Datei? ",1,"Ja|Nein|Weiter|Abbruch")
  9375.             '
  9376.             SELECT rrg%
  9377.             CASE 3
  9378.               CLR dmt%
  9379.             CASE 2
  9380.               INC bac%
  9381.               aa%=@read_in_fat(bac%)
  9382.               WHILE aa%
  9383.                 INC bac%
  9384.                 aa%=@read_in_fat(bac%)
  9385.               WEND
  9386.             ENDSELECT
  9387.           ENDIF
  9388.           EXIT IF rrg%=1 OR rrg%=4
  9389.         LOOP
  9390.         '
  9391.         EXIT IF bac%>=cpd%+2 OR rrg%=4
  9392.         '
  9393.         cl%=bac%
  9394.         aa%=@read_in_fat(cl%+1)
  9395.         WHILE aa%<>0
  9396.           INC cl%
  9397.           aa%=@read_in_fat(cl%+1)
  9398.         WEND
  9399.         '
  9400.         INC cl%
  9401.         CLR dv%
  9402.         '
  9403.         IF (att%(sf%) AND 16)<>0   ! Ordner?
  9404.           dv%=@alrt(2,"Das ist ein Verzeichnis. |Weitersuchen?",1,"Ja|Nein|Abbruch")
  9405.           SELECT dv%
  9406.           CASE 3
  9407.             rrg%=4
  9408.           CASE 2
  9409.             cpf%=repair%+2
  9410.             write_in_fat(cl%,bac%)
  9411.           CASE 1
  9412.             repair%=9999
  9413.           ENDSELECT
  9414.         ELSE
  9415.           write_in_fat(cl%,bac%)
  9416.         ENDIF
  9417.         '
  9418.         INC repair%
  9419.         EXIT IF repair%>=cpf% OR rrg%=4 OR dv%=2
  9420.         foc%=cl%
  9421.       LOOP
  9422.       '
  9423.       IF rrg%<>4
  9424.         write_in_fat(ed%,bac%)
  9425.         IF @alrt(2,"Datei restauriert!! ",0,"Schreiben|Abbruch")=1
  9426.           write_fat
  9427.           sektor%=sec%(sf%)
  9428.           bb$=STRING$(bps%,0)
  9429.           status%=@rwabs(0,VARPTR(bb$),1,sektor%,drive%)
  9430.           IF status%=0
  9431.             s$=@nam_conv$(kaputt$,1)
  9432.             FOR i%=1 TO bps% STEP 32
  9433.               f$=MID$(bb$,i%,11)
  9434.               IF f$=s$
  9435.                 einname("Name des Programms:",s$)
  9436.                 MID$(bb$,i%,11)=a$
  9437.                 i%=bps%+1
  9438.                 out$(witch%)=""
  9439.               ENDIF
  9440.             NEXT i%
  9441.             IF @media(drive%)=0
  9442.               status%=@rwabs(1,VARPTR(bb$),1,sektor%,drive%)
  9443.             ELSE
  9444.               status%=-1
  9445.             ENDIF
  9446.             err_inf(status%)
  9447.           ENDIF
  9448.         ENDIF
  9449.       ENDIF
  9450.       EXIT IF 1
  9451.     LOOP
  9452.     bios_block(drive%)
  9453.     wind_top(whdl&(1))
  9454.     do_list
  9455.   ENDIF
  9456. RETURN
  9457. PROCEDURE lies_1
  9458.   .| Glob. Var.: p$,f$,alle%
  9459.   .| Ruft auf  : out
  9460.   .| Aufruf in : lies_all-1,
  9461.   out(p$+f$)
  9462.   INC alle%
  9463. RETURN
  9464. ' --------------------- Proceduren für FILE -------------------
  9465. PROCEDURE file_open
  9466.   .| Glob. Var.: file_open%,fi$,fi_old$
  9467.   .| Ruft auf  : file_close,info_line,clear_buf,do_list,fsel$,do_file_open
  9468.   .| Aufruf in : menu_mess-1,file_name-1,
  9469.   IF file_open%>0
  9470.     file_close
  9471.     info_line
  9472.   ENDIF
  9473.   clear_buf(0)
  9474.   do_list
  9475.   fi$=@fsel$("*.*",fi_old$,"Datei öffnen",7)
  9476.   do_file_open(fi$)
  9477.   do_list
  9478. RETURN
  9479. PROCEDURE file_close
  9480.   .| Glob. Var.: file_open%,f_hdl%,fl%,fp%,fi_o$,z%
  9481.   .| Ruft auf  : change,fclose,clear_buf,do_list,alrt
  9482.   .| Aufruf in : menu_mess-1,file_open-1,last_10-1,
  9483.   IF file_open%>0
  9484.     change
  9485.     ~@fclose(f_hdl%)
  9486.     file_open%=-1
  9487.     CLR fl%,fp%,fi_o$,z%
  9488.     clear_buf(0)
  9489.     do_list
  9490.   ELSE
  9491.     ~@alrt(3,"Welches File schließen?",1,"Keins")
  9492.   ENDIF
  9493. RETURN
  9494. PROCEDURE file_write
  9495.   .| Glob. Var.: file_open%,file_protect%,fl%,fp%,bps%,f_hdl%,buf%,ch%
  9496.   .| Ruft auf  : fseek,fwrite2,do_cursor_anz,file_read,alrt
  9497.   .| Aufruf in : schreiben-1,menu_mess-1,
  9498.   LOCAL fr%
  9499.   IF file_open%=1
  9500.     IF file_protect%=0
  9501.       fr%=MIN(fl%-fp%,bps%)
  9502.       ~@fseek(fp%,f_hdl%,0)
  9503.       fwrite2(f_hdl%,buf%,fr%)
  9504.       CLR ch%
  9505.       do_cursor_anz(0)
  9506.       file_read
  9507.     ELSE
  9508.       ~@alrt(3,"Datei ist schreibgeschützt!",1,"Abbruch")
  9509.     ENDIF
  9510.   ELSE
  9511.     ~@alrt(3,"In welche Datei|soll ich schreiben?",1,"Abbruch")
  9512.   ENDIF
  9513. RETURN
  9514. PROCEDURE file_read
  9515.   .| Glob. Var.: file_open%,fp%,fl%,f_hdl%,bps%,buf%,bf$
  9516.   .| Felder    : whdl&()
  9517.   .| Ruft auf  : fseek,set_slide,fread2
  9518.   .| Aufruf in : lesen-1,file_write-1,file_dump-1,
  9519.   LOCAL dl%,fr%
  9520.   IF file_open%=1
  9521.     IF fp%<fl%
  9522.       ~@fseek(fp%,f_hdl%,0)
  9523.       fr%=fl%-fp%
  9524.       IF fr%>0
  9525.         set_slide(whdl&(0))
  9526.         dl%=MIN(bps%,fr%)
  9527.         fread2(f_hdl%,buf%,dl%)
  9528.         IF dl%<>bps%
  9529.           bf$=STRING$(bps%+1-dl%,0)
  9530.           BMOVE V:bf$,buf%+dl%,LEN(bf$)
  9531.           CLR bf$
  9532.         ENDIF
  9533.       ENDIF
  9534.     ENDIF
  9535.   ENDIF
  9536. RETURN
  9537. PROCEDURE file_compare  ! 2 Dateien (Pfade) vergleichen
  9538.   .| Glob. Var.: ver_base%,f1$,f2$,erg%
  9539.   .| Ruft auf  : fsel$,clr_out,pfad_compare,file_verify,out_do,set_last
  9540.   .| Aufruf in : base_look-1,menu_mess-1,
  9541.   IF ver_base%=0
  9542.     f1$=@fsel$("*.*","","Verify - Datei/Pfad 1",8)
  9543.     f2$=@fsel$("*.*","","Verify - Datei/Pfad 2",9)
  9544.   ENDIF
  9545.   erg%=3
  9546.   CLR ver_base%
  9547.   clr_out("Dateien vergleichen")
  9548.   IF RIGHT$(f1$,1)="\" AND RIGHT$(f2$,1)="\"
  9549.     pfad_compare(f1$,f2$)
  9550.   ELSE
  9551.     file_verify(f1$,f2$)
  9552.   ENDIF
  9553.   out_do
  9554.   set_last(10)
  9555. RETURN
  9556. PROCEDURE last_10       ! Unterschiede anzeigen und nach Klick Datei öffnen
  9557.   .| Glob. Var.: txt_zeile%,top%,x$,file_open%,fp%
  9558.   .| Felder    : out$(),whdl&()
  9559.   .| Ruft auf  : file_close,info_line,do_file_open,lesen,wind_top
  9560.   .| Aufruf in : maus_pos-1,
  9561.   LOCAL x%,a%,a$,fx$
  9562.   '
  9563.   x%=txt_zeile%+top%
  9564.   x$=out$(x%)
  9565.   IF (LEFT$(x$,2)="1:" OR LEFT$(x$,2)="2:") AND MID$(x$,4,1)<>":"
  9566.     a%=x%
  9567.     REPEAT
  9568.       DEC a%            ! Dateinamen suchen
  9569.     UNTIL MID$(out$(a%),4,1)=":" OR a%=0
  9570.     IF a%>0
  9571.       IF ASC(x$)=49     ! "1"
  9572.         DEC a%          ! da erst der 2. Name gefunden wird, eine Zeile drüber
  9573.       ENDIF
  9574.       a$=out$(a%)               ! = Dateiname
  9575.       fx$=RIGHT$(a$,LEN(a$)-2)
  9576.       IF EXIST(fx$)=TRUE        ! Datei gefunden und noch existent?
  9577.         IF file_open%=1         ! ja, andere Datei offen?
  9578.           file_close            ! Ja,
  9579.           info_line
  9580.         ENDIF
  9581.         do_file_open(fx$)       ! jetzt Datei öffnen
  9582.         fp%=VAL(MID$(x$,3,8))   ! Pointer auf Adresse
  9583.         lesen                   ! dort lesen
  9584.         wind_top(whdl&(0))      ! Datenfenster oben
  9585.       ENDIF
  9586.     ENDIF
  9587.   ENDIF
  9588. RETURN
  9589. '
  9590. PROCEDURE file_dump             ! Datei als DUMP ausgeben
  9591.   .| Glob. Var.: file_open%,erg%,device%,hdl%,ver$,fi_o$,fl%,no_nxt%
  9592.   .| Felder    : l_end%()
  9593.   .| Ruft auf  : dev,fwritec,do_dump,nxt_blk,file_read,was_ist,look_ex,alrt
  9594.   .|     mnorm
  9595.   .| Aufruf in : menu_mess-1,
  9596.   IF file_open%=1
  9597.     erg%=1
  9598.     dev("Datei ausgeben",34)
  9599.     IF device%<>99
  9600.       fwritec(hdl%,ver$+":   "+DATE$+"   "+TIME$)
  9601.       fwritec(hdl%,"Datei : "+fi_o$+" Länge: "+STR$(fl%)+" Bytes")
  9602.       fwritec(hdl%,STRING$(75,"-"))
  9603.       DO
  9604.         do_dump(0,l_end%(0))
  9605.         nxt_blk
  9606.         EXIT IF no_nxt%<>0
  9607.         file_read
  9608.         EXIT IF @was_ist>0
  9609.       LOOP
  9610.       look_ex
  9611.     ENDIF
  9612.   ELSE
  9613.     ~@alrt(3,"Bitte Datei erst öffnen.",1,"Mach ich")
  9614.   ENDIF
  9615.   mnorm
  9616. RETURN
  9617. PROCEDURE file_name             ! Dateinamen ändern (Klick auf Statuszeile)
  9618.   .| Glob. Var.: file_open%,fi_o$
  9619.   .| Ruft auf  : do_datei_info,file_open
  9620.   .| Aufruf in : stat_line-2,
  9621.   IF file_open%=1
  9622.     do_datei_info(fi_o$)
  9623.   ELSE
  9624.     file_open
  9625.   ENDIF
  9626. RETURN
  9627. '
  9628. PROCEDURE datei_cut             ! Datei aufteilen
  9629.   .| Glob. Var.: file_open%,wa$,fp%,tz%,z%,erg%,device%,bps%,hdl%,buf%,bc%,fl%
  9630.   .| Ruft auf  : change,alrt,dev,lesen,fwrite2,fclose,clear_buf,do_list
  9631.   .| Aufruf in : menu_mess-1,
  9632.   LOCAL b%,la%,fa%,fz%,fc%,fi%
  9633.   '
  9634.   IF file_open%=1
  9635.     change
  9636.     IF @alrt(2,"Datei an aktueller|Cursorposition abschneiden?",1,wa$)=1
  9637.       fc%=fp%+tz%+z%
  9638.       erg%=1
  9639.       dev("Datei aufteilen - 1. Datei",35)
  9640.       IF device%<>99
  9641.         fz%=z%
  9642.         CLR z%,fp%
  9643.         lesen
  9644.         fi%=1
  9645.         WHILE fi%<=INT(fc%/bps%)
  9646.           fwrite2(hdl%,buf%,bps%)
  9647.           ADD fp%,bps%
  9648.           lesen
  9649.           INC fi%
  9650.         WEND
  9651.         bc%=fc%-INT(fc%/bps%)*bps%
  9652.         IF bc%>0
  9653.           fwrite2(hdl%,buf%,bc%)
  9654.         ENDIF
  9655.         ~@fclose(hdl%)
  9656.         '
  9657.         erg%=1
  9658.         dev("Datei aufteilen - 2. Datei",36)
  9659.         IF device%<>99
  9660.           z%=fz%
  9661.           fp%=fc%
  9662.           lesen
  9663.           fa%=fl%-fc%
  9664.           WHILE fa%>=bps%
  9665.             fwrite2(hdl%,buf%,bps%)
  9666.             ADD fp%,bps%
  9667.             SUB fa%,bps%
  9668.             lesen
  9669.           WEND
  9670.           '
  9671.           IF fa%>0
  9672.             fwrite2(hdl%,buf%,fa%)
  9673.           ENDIF
  9674.           ~@fclose(hdl%)
  9675.           '
  9676.         ENDIF
  9677.       ENDIF
  9678.     ENDIF
  9679.   ELSE
  9680.     ~@alrt(3,"Bitte Datei erst öffnen.",1,"Mach ich")
  9681.   ENDIF
  9682.   clear_buf(0)
  9683.   do_list
  9684. RETURN
  9685. PROCEDURE datei_concat          ! 2 Dateien verbinden
  9686.   .| Glob. Var.: f1$,f2$,erg%,device%,a1%,a2%,bps%,buf%,hdl%,fehler%
  9687.   .| Ruft auf  : fsel$,dev,fopen,fseek,fread2,fwrite2,fclose,clear_buf
  9688.   .| Aufruf in : menu_mess-1,
  9689.   LOCAL hdl1%,hdl2%
  9690.   '
  9691.   f1$=@fsel$("*.*","","1. Datei verbinden",11)
  9692.   IF EXIST(f1$)=TRUE
  9693.     f2$=@fsel$("*.*","","2. Datei verbinden",12)
  9694.     IF EXIST(f2$)=TRUE
  9695.       erg%=1
  9696.       dev("Dateien verbinden - Zieldatei",37)
  9697.       IF device%<>99
  9698.         hdl1%=@fopen(f1$,0)
  9699.         hdl2%=@fopen(f2$,0)
  9700.         '
  9701.         a1%=@fseek(0,hdl1%,2)
  9702.         ~@fseek(0,hdl1%,0)
  9703.         '
  9704.         a2%=@fseek(0,hdl2%,2)
  9705.         ~@fseek(0,hdl2%,0)
  9706.         '
  9707.         REPEAT
  9708.           WHILE a1%>=bps%
  9709.             fread2(hdl1%,buf%,bps%)
  9710.             fwrite2(hdl%,buf%,bps%)
  9711.             SUB a1%,bps%
  9712.             EXIT IF fehler%<0
  9713.           WEND
  9714.           EXIT IF fehler%<0
  9715.           IF a1%>0
  9716.             fread2(hdl1%,buf%,a1%)
  9717.             fwrite2(hdl%,buf%,a1%)
  9718.           ENDIF
  9719.           '
  9720.           WHILE a2%>=bps%
  9721.             fread2(hdl2%,buf%,bps%)
  9722.             fwrite2(hdl%,buf%,bps%)
  9723.             SUB a2%,bps%
  9724.             EXIT IF fehler%<0
  9725.           WEND
  9726.           EXIT IF fehler%<0
  9727.           IF a2%>0
  9728.             fread2(hdl2%,buf%,a2%)
  9729.             fwrite2(hdl%,buf%,a2%)
  9730.           ENDIF
  9731.         UNTIL 1
  9732.         ~@fclose(hdl1%)
  9733.         ~@fclose(hdl2%)
  9734.         ~@fclose(hdl%)
  9735.       ENDIF
  9736.       clear_buf(0)
  9737.     ENDIF
  9738.   ENDIF
  9739. RETURN
  9740. PROCEDURE datei_copy            ! Datei kopieren
  9741.   .| Glob. Var.: f1$,f2$
  9742.   .| Ruft auf  : fsel$,do_file_copy
  9743.   .| Aufruf in : hard_install-1,menu_mess-1,
  9744.   LOCAL a$
  9745.   f1$=@fsel$("*.*","","Datei kopieren  Quell:",13)
  9746.   IF EXIST(f1$)=TRUE
  9747.     a$=RIGHT$(f1$,LEN(f1$)-RINSTR(f1$,"\"))
  9748.     f2$=@fsel$("*.*",a$,"Datei kopieren  Ziel:",14)
  9749.     IF f2$<>""
  9750.       IF RIGHT$(f2$)="\"
  9751.         f2$=f2$+a$
  9752.       ENDIF
  9753.       do_file_copy(f1$,f2$)
  9754.     ENDIF
  9755.   ENDIF
  9756. RETURN
  9757. PROCEDURE datei_del             ! Datei löschen
  9758.   .| Glob. Var.: fi$,wa$
  9759.   .| Ruft auf  : fsel$,alrt,fdelete
  9760.   .| Aufruf in : menu_mess-1,
  9761.   DO
  9762.     fi$=@fsel$("*.*","","Datei löschen",15)
  9763.     EXIT IF EXIST(fi$)=FALSE
  9764.     IF @alrt(2,RIGHT$(fi$,38)+"|löschen???",0,wa$)=1
  9765.       ~@fdelete(fi$)
  9766.     ENDIF
  9767.   LOOP
  9768. RETURN
  9769. '
  9770. PROCEDURE datei_suchen
  9771.   .| Glob. Var.: erg%,fi$,dta$,dta%,ab$,a$,el%,s$,lies_mode%,out%
  9772.   .| Felder    : out$()
  9773.   .| Ruft auf  : clr_out,fsel$,fgetdta,einname,nam_conv$,wandeln,alltoone
  9774.   .|     lies_all,out_do
  9775.   .| Aufruf in : menu_mess-1,
  9776.   erg%=3
  9777.   clr_out("Datei suchen")
  9778.   fi$=@fsel$("*.*","","DATEI-SUCHEN Pfad",17)
  9779.   IF fi$<>""
  9780.     fi$=LEFT$(fi$,RINSTR(fi$,"\"))
  9781.     dta$=STRING$(44,0)
  9782.     dta%=@fgetdta
  9783.     einname("Was suchen","")
  9784.     ab$=@nam_conv$(a$,0)
  9785.     IF el%>0
  9786.       s$=@nam_conv$(a$,0)
  9787.       wandeln(s$)
  9788.       alltoone(a$)
  9789.       s$=a$
  9790.       lies_mode%=3
  9791.       lies_all(fi$)
  9792.       out$(0)=ab$+" = "+STR$(out%-1)+" Dateien gefunden"
  9793.       out_do
  9794.     ENDIF
  9795.   ENDIF
  9796. RETURN
  9797. PROCEDURE lies_3                ! Dateien suchen
  9798.   .| Glob. Var.: f$,s$,gleich!,p$
  9799.   .| Ruft auf  : wandeln,n_compare,out
  9800.   .| Aufruf in : lies_all-1,
  9801.   LOCAL a$,b$,i%
  9802.   wandeln(f$)
  9803.   n_compare(a$,s$)
  9804.   IF gleich!=TRUE
  9805.     out(p$+f$)
  9806.   ENDIF
  9807. RETURN
  9808. '
  9809. PROCEDURE file_verify(f1$,f2$)  ! 2 Dateien vergleichen
  9810.   .| Glob. Var.: erg%,anz_diff%,mk%,b%,st1%,st2%,vi%,fehler%,abb%,a%,st3%,st4%
  9811.   .| Ruft auf  : out,fopen,fseek,mtasse,was_ist,fread$,vergleich,fclose,out_do
  9812.   .|     lend,mnorm
  9813.   .| Aufruf in : file_compare-1,pfad_compare-1,
  9814.   LOCAL fp1%,fp2%,hdl1%,hdl2%,a1%,a2%,a1$,a2$
  9815.   '
  9816.   REPEAT
  9817.     EXIT IF EXIST(f2$)=FALSE OR EXIST(f1$)=FALSE
  9818.     erg%=3
  9819.     out("")
  9820.     out("1:"+f1$)
  9821.     out("2:"+f2$)
  9822.     CLR anz_diff%,mk%
  9823.     REPEAT
  9824.       hdl1%=@fopen(f1$,0)
  9825.       EXIT IF hdl1%<6
  9826.       hdl2%=@fopen(f2$,0)
  9827.       EXIT IF hdl2%<6
  9828.       CLR fp1%,fp2%
  9829.       a1%=@fseek(0,hdl1%,2)
  9830.       ~@fseek(0,hdl1%,0)
  9831.       '
  9832.       a2%=@fseek(0,hdl2%,2)
  9833.       ~@fseek(0,hdl2%,0)
  9834.       IF a1%=0 OR a2%=0
  9835.         out("Eine Datei hat Länge '0'")
  9836.       ENDIF
  9837.       EXIT IF a1%=0 OR a2%=0
  9838.       IF a1%<>a2%
  9839.         out("Dateien ungleich lang!")
  9840.       ENDIF
  9841.       b%=MIN(1024,MIN(a1%,a2%))     ! Wenn File kürzer als 1024 Bytes
  9842.       st1%=INT(a1%/b%)
  9843.       st2%=INT(a2%/b%)
  9844.       vi%=1
  9845.       fehler%=99
  9846.       mtasse
  9847.       DO
  9848.         abb%=@was_ist
  9849.         EXIT IF abb%>0
  9850.         a1$=@fread$(hdl1%,b%)
  9851.         ADD fp1%,fehler%
  9852.         a2$=@fread$(hdl2%,b%)
  9853.         ADD fp2%,fehler%
  9854.         IF a1$<>a2$
  9855.           vergleich
  9856.         ENDIF
  9857.         EXIT IF fehler%<=0 OR mk%=2
  9858.         INC vi%
  9859.         a%=vi%*b% DIV 1024
  9860.         EXIT IF vi%>st1% OR vi%>st2%
  9861.       LOOP
  9862.       IF abb%<>2
  9863.         st3%=MIN(1024,MIN(a1%-fp1%,a2%-fp2%))
  9864.         st4%=MIN(1024,MIN(a1%-fp1%,a2%-fp2%))
  9865.         a1$=@fread$(hdl1%,st3%)
  9866.         ADD fp1%,fehler%
  9867.         a2$=@fread$(hdl2%,st4%)
  9868.         ADD fp2%,fehler%
  9869.         IF a1$<>a2$
  9870.           vergleich
  9871.         ENDIF
  9872.         IF a1%<>a2% AND anz_diff%=0
  9873.           out("Dateien sind ungleich lang, aber sonst identisch!")
  9874.         ELSE
  9875.           IF anz_diff%>0
  9876.             out("Dateien sind an "+STR$(anz_diff%)+" Stellen unterschiedlich!")
  9877.           ELSE
  9878.             out("Dateien sind identisch!")
  9879.           ENDIF
  9880.         ENDIF
  9881.       ENDIF
  9882.       ~@fclose(hdl1%)
  9883.       ~@fclose(hdl2%)
  9884.       IF anz_diff%>0
  9885.         out_do
  9886.         lend(1)
  9887.       ENDIF
  9888.     UNTIL 1
  9889.   UNTIL 1
  9890.   mnorm
  9891. RETURN
  9892. PROCEDURE vergleich
  9893.   .| Glob. Var.: fehler%,a1$,a2$,anz_diff%
  9894.   .| Ruft auf  : verify_out
  9895.   .| Aufruf in : file_verify-2,
  9896.   LOCAL j%,x%
  9897.   '
  9898.   fehler%=99
  9899.   FOR j%=1 TO LEN(a1$) STEP 16
  9900.     IF MID$(a1$,j%,16)<>MID$(a2$,j%,16)
  9901.       '
  9902.       FOR x%=0 TO 15    ! detaillierte Suche nach Anzahl der Unterschiede
  9903.         IF MID$(a1$,j%+x%,1)<>MID$(a2$,j%+x%,1)
  9904.           INC anz_diff%
  9905.         ENDIF
  9906.       NEXT x%
  9907.       '
  9908.       verify_out(j%,a1$,"1:")
  9909.       verify_out(j%,a2$,"2:")
  9910.     ENDIF
  9911.     EXIT IF fehler%<=0
  9912.   NEXT j%
  9913. RETURN
  9914. PROCEDURE verify_out(wo%,buf$,a$)
  9915.   .| Glob. Var.: j%,av$,vi%
  9916.   .| Ruft auf  : dec_hex_val$,out
  9917.   .| Aufruf in : vergleich-2,
  9918.   LOCAL a%,i%,o$
  9919.   '
  9920.   o$=SPACE$(66)
  9921.   FOR i%=0 TO 15
  9922.     a%=BYTE{V:buf$+j%+i%-1}
  9923.     MID$(o$,i%*3+1)=HEX$(a%,2)
  9924.     MID$(o$,i%+50,1)=CHR$(a%)
  9925.   NEXT i%
  9926.   av$=@dec_hex_val$((vi%-1)*1024+wo%-1,8)
  9927.   out(a$+av$+" "+o$)
  9928. RETURN
  9929. '
  9930. PROCEDURE pfad_compare(pfad1$,pfad2$)
  9931.   .| Glob. Var.: dta$,dta%,total%,abb%,erg%,lies_mode%
  9932.   .| Felder    : file$()
  9933.   .| Ruft auf  : fgetdta,floppy_param,lies_all,out,out_do,lend,file_verify
  9934.   .|     was_ist
  9935.   .| Aufruf in : file_compare-1,
  9936.   LOCAL i%,j%,a$,x$
  9937.   '
  9938.   dta$=STRING$(44,0)
  9939.   dta%=@fgetdta
  9940.   CLR total%,i%,abb%
  9941.   '
  9942.   erg%=3
  9943.   floppy_param
  9944.   lies_mode%=4
  9945.   lies_all(pfad1$)
  9946.   DEC total%
  9947.   '
  9948.   out(STR$(total%)+" Dateien sind zu vergleichen ...")
  9949.   out_do
  9950.   lend(1)
  9951.   '
  9952.   WHILE i%<=total%
  9953.     EXIT IF abb%>0
  9954.     x$=file$(i%)
  9955.     j%=1
  9956.     '
  9957.     WHILE MID$(x$,j%,1)=MID$(pfad1$,j%,1)
  9958.       INC j%
  9959.     WEND
  9960.     DEC j%      ! 1. Zeichen das nicht gleich ist
  9961.     '
  9962.     a$=RIGHT$(x$,LEN(x$)-j%)
  9963.     a$=pfad2$+a$
  9964.     '
  9965.     IF EXIST(a$)=TRUE
  9966.       file_verify(x$,a$)
  9967.       out_do
  9968.       lend(1)
  9969.     ELSE
  9970.       out("Datei: "+a$+" nicht gefunden.")
  9971.       out_do
  9972.       lend(1)
  9973.       abb%=@was_ist
  9974.     ENDIF
  9975.     INC i%
  9976.   WEND
  9977. RETURN
  9978. PROCEDURE lies_4
  9979.   .| Glob. Var.: total%,p$,f$
  9980.   .| Felder    : file$()
  9981.   .| Aufruf in : lies_all-1,
  9982.   file$(total%)=p$+f$
  9983.   INC total%
  9984. RETURN
  9985. '
  9986. PROCEDURE file_is_open
  9987.   .| Glob. Var.: file_open%,f_hdl%
  9988.   .| Ruft auf  : fclose
  9989.   .| Aufruf in : media_all-1,media-1,no_on-1,pexec-1,start_shell-1,exit-1,
  9990.   IF file_open%=1
  9991.     ~@fclose(f_hdl%)
  9992.     CLR file_open%
  9993.   ENDIF
  9994. RETURN
  9995. PROCEDURE do_file_copy(f1$,f2$)
  9996.   .| Glob. Var.: fhandle%,erg%,bps%,buf%
  9997.   .| Ruft auf  : mdisk,fopen,fseek,alrt,fread2,fclose,fcreate,fwrite2,mnorm
  9998.   .| Aufruf in : hard_install-1,datei_copy-1,
  9999.   LOCAL a1%,a2%,ab%,b%,i%,hdl1%
  10000.   '
  10001.   IF EXIST(f1$)=TRUE                    ! Nur wenn Quelldatei da ist
  10002.     mdisk
  10003.     fhandle%=@fopen(f1$,0)              ! Datei öffnen
  10004.     a1%=@fseek(0,fhandle%,2)            ! Länge feststellen
  10005.     ~@fseek(0,fhandle%,0)               ! Ab Byte 0 lesen
  10006.     '
  10007.     erg%=@alrt(1,"Sektoren einzeln kopieren?",1,"Ja| Nein ")
  10008.     IF erg%=2
  10009.       a2%=MALLOC(a1%)                     ! Speicher organisieren
  10010.     ENDIF
  10011.     '
  10012.     IF a2%>0                            ! Speicher da?
  10013.       fread2(fhandle%,a2%,a1%)          ! Datei komplett einlesen
  10014.       ~@fclose(fhandle%)                ! Quell schliessen
  10015.       fhandle%=@fcreate(f2$,0)          ! Neue Datei erzeugen
  10016.       IF fhandle%>0                     ! Ohne Fehler?
  10017.         fwrite2(fhandle%,a2%,a1%)       ! Ja, komplett schreiben
  10018.         ~@fclose(fhandle%)              ! Fertig
  10019.       ENDIF
  10020.       ~MFREE(a2%)                       ! Speicher zurückgeben
  10021.     ELSE
  10022.       ab%=a1%/bps%                      ! Kein Speicher, Anzahl der Sektoren
  10023.       hdl1%=fhandle%                    ! Quellhandle merken
  10024.       fhandle%=@fcreate(f2$,0)          ! Neue Datei erzeugen
  10025.       IF fhandle%>0                     ! Ohne Fehler?
  10026.         FOR i%=1 TO ab%
  10027.           fread2(hdl1%,buf%,bps%)       ! einen Sektor lesen
  10028.           fwrite2(fhandle%,buf%,bps%)   ! und auch schreiben
  10029.         NEXT i%
  10030.         IF a1%>ab%*bps%                 ! wenn Länge <> Sektorgrenze
  10031.           b%=a1%-ab%*bps%
  10032.           fread2(hdl1%,buf%,b%)         ! Rest lesen
  10033.           fwrite2(fhandle%,buf%,b%)     !  '   schreiben
  10034.         ENDIF
  10035.         ~@fclose(fhandle%)              ! Zieldatei fertig
  10036.       ENDIF
  10037.       ~@fclose(hdl1%)                   ! Quell schliessen
  10038.       mnorm
  10039.     ENDIF
  10040.   ENDIF
  10041. RETURN
  10042. PROCEDURE do_file_open(fi$)
  10043.   .| Glob. Var.: fi_old$,fhandle%,file_protect%,fi_o$,file_open%,f_hdl%,fl%
  10044.   .|     fp%,z%
  10045.   .| Ruft auf  : alrt,fopen,fseek,lesen,info_line,clear_buf
  10046.   .| Aufruf in : base_look-1,file_on-1,file_open-1,last_10-1,
  10047.   LOCAL df$
  10048.   '
  10049.   IF EXIST(fi$)=TRUE
  10050.     fi_old$=RIGHT$(fi$,LEN(fi$)-RINSTR(fi$,"\"))
  10051.     df$=fi$+CHR$(0)
  10052.     fhandle%=GEMDOS(61,L:VARPTR(df$),2) ! FOPEN
  10053.     '
  10054.     IF fhandle%=-36
  10055.       ~GEMDOS(62,W:fhandle%)            ! FCLOSE
  10056.       ~@alrt(1,"Datei kann nicht verändert werden!",1," Aha ")
  10057.       file_protect%=1
  10058.       fhandle%=@fopen(fi$,0)
  10059.     ELSE
  10060.       file_protect%=0
  10061.     ENDIF
  10062.     IF fhandle%>5
  10063.       fi_o$=fi$
  10064.       file_open%=1
  10065.       f_hdl%=fhandle%
  10066.       fl%=@fseek(0,f_hdl%,2)
  10067.       CLR fp%,z%
  10068.       lesen
  10069.       info_line
  10070.     ELSE
  10071.       clear_buf(0)
  10072.     ENDIF
  10073.   ENDIF
  10074. RETURN
  10075. PROCEDURE datei_info
  10076.   .| Glob. Var.: fi$
  10077.   .| Ruft auf  : fsel$,do_datei_info
  10078.   .| Aufruf in : menu_mess-1,
  10079.   fi$=@fsel$("*.*","","Datei-INFO",18)
  10080.   IF EXIST(fi$)=TRUE
  10081.     do_datei_info(fi$)
  10082.   ENDIF
  10083. RETURN
  10084. PROCEDURE do_datei_info(fi$)
  10085.   .| Glob. Var.: d.name$,d.atei%,datname&,d.attr%,dat1&,fhandle%,fll%,datsize&
  10086.   .|     buf$,d.header%,dath1&,dath4&,datramk&,datsegm&,dats1&,dats2&,dats3&
  10087.   .|     dats4&,dat$,n$,datdat&,dattime&,datok&,b%,fi_o$
  10088.   .| Ruft auf  : nam_conv$,put_char,fattrib,cross_rsc,fopen,fread$,fseek
  10089.   .|     put_wert,set_flags,clr_flags,fdatime,fclose,box_draw,form_do
  10090.   .|     box_undraw,clr_state,get_char$,get_val,alrt,fwrite,frename,do_list
  10091.   .|     lesen
  10092.   .| Aufruf in : file_name-1,datei_info-1,last_3-1,
  10093.   LOCAL a%,i%,j&,ex_obj&,dt%,tm%,a$,b$,path$,fil$,new$,bra$,dt$,tm$
  10094.   '
  10095.   REPEAT
  10096.     d.name$=RIGHT$(fi$,LEN(fi$)-RINSTR(fi$,"\"))
  10097.     a$=d.name$
  10098.     path$=LEFT$(fi$,LEN(fi$)-LEN(a$))
  10099.     fil$=@nam_conv$(a$,1)
  10100.     put_char(d.atei%,datname&,fil$)
  10101.     ' ---------------------------
  10102.     d.attr%=@fattrib(fi$,0,0)   ! Attribut
  10103.     j&=dat1&
  10104.     FOR i%=0 TO 5
  10105.       cross_rsc(d.atei%,j&,d.attr% AND 2^i%)
  10106.       INC j&
  10107.     NEXT i%
  10108.     OB_TYPE(d.atei%,dat4&)=OB_TYPE(d.atei%,dat4&) AND &HFF  !RS: In der Resource ändern!
  10109.     OB_TYPE(d.atei%,dat5&)=OB_TYPE(d.atei%,dat5&) AND &HFF  !RS: "
  10110.     IF (d.attr% AND &H18)=8     ! Datenträgername
  10111.       OB_TYPE(d.atei%,dat1&)=OB_TYPE(d.atei%,dat1&) AND &HFF
  10112.       OB_TYPE(d.atei%,dat2&)=OB_TYPE(d.atei%,dat2&) AND &HFF
  10113.       OB_TYPE(d.atei%,dat3&)=OB_TYPE(d.atei%,dat3&) AND &HFF
  10114.       ' Ist von MS-DOS oder Mac das Archiv-Bit gesetzt, läßt es sich löschen.
  10115.       IF (d.attr% AND &H20)=0
  10116.         OB_TYPE(d.atei%,dat6&)=OB_TYPE(d.atei%,dat6&) AND &HFF
  10117.       ENDIF
  10118.     ELSE
  10119.       OB_TYPE(d.atei%,dat1&)=OB_TYPE(d.atei%,dat1&) OR &H1200
  10120.       OB_TYPE(d.atei%,dat2&)=OB_TYPE(d.atei%,dat2&) OR &H1200
  10121.       OB_TYPE(d.atei%,dat3&)=OB_TYPE(d.atei%,dat3&) OR &H1200
  10122.       OB_TYPE(d.atei%,dat6&)=OB_TYPE(d.atei%,dat6&) OR &H1200
  10123.     ENDIF
  10124.     ' ---------------------------
  10125.     fhandle%=@fopen(fi$,0)      ! Datei öffnen
  10126.     EXIT IF fhandle%<6          ! ok?
  10127.     '
  10128.     fll%=@fseek(0,fhandle%,2)   ! Länge feststellen
  10129.     put_wert(d.atei%,datsize&,fll%,9)
  10130.     '
  10131.     ' ------------------
  10132.     ~@fseek(0,fhandle%,0)       ! Offset 00
  10133.     IF fll%>28
  10134.       buf$=@fread$(fhandle%,28) ! 28 Bytes lesen
  10135.     ELSE
  10136.       buf$=STRING$(28,0)        ! Datei zu klein
  10137.     ENDIF
  10138.     bra$=LEFT$(buf$,2)          ! Byte 0+1 lesen
  10139.     '
  10140.     d.header%=CVL(MID$(buf$,23,4))      ! Dateiheader (Byte 25) -> Dialog
  10141.     j&=dath1&
  10142.     FOR i%=0 TO 7
  10143.       IF i%<>3
  10144.         cross_rsc(d.atei%,j&,d.header% AND 2^i%)
  10145.       ENDIF
  10146.       INC j&
  10147.     NEXT i%
  10148.     a%=(d.header% AND &H0)
  10149.     a%=SHR(a%,28)
  10150.     put_char(d.atei%,dath4&,LEFT$(STR$(a%),2))  ! zusätzlichen Speicher?
  10151.     '
  10152.     IF CVI(bra$)<>&H601A                        ! Programmdatei?
  10153.       set_flags(d.atei%,datramk&,&H80)          ! HIDE
  10154.       clr_flags(d.atei%,dath4&,8)               ! NO EDIT
  10155.       set_flags(d.atei%,datsegm&,&H80)          ! HIDE
  10156.     ENDIF
  10157.     put_char(d.atei%,dats1&,HEX$(CVL(MID$(buf$,3,4)),9))
  10158.     put_char(d.atei%,dats2&,HEX$(CVL(MID$(buf$,7,4)),9))
  10159.     put_char(d.atei%,dats3&,HEX$(CVL(MID$(buf$,11,4)),9))
  10160.     put_char(d.atei%,dats4&,HEX$(CVL(MID$(buf$,15,4)),9))
  10161.     ' -------------------
  10162.     dat$=STRING$(4,0)                   ! Puffer für Zeit/Datum
  10163.     ~@fdatime(VARPTR(dat$),fhandle%,0)
  10164.     ~@fclose(fhandle%)                  ! Datei schließen
  10165.     '
  10166.     tm%=CARD{VARPTR(dat$)}
  10167.     tm$=RIGHT$(n$+STR$((tm% DIV 2048) AND 31),2)
  10168.     tm$=tm$+RIGHT$(n$+STR$((tm% DIV 32) AND 63),2)
  10169.     ' tm$=tm$+RIGHT$(n$+STR$((tm% AND 31)*2),2)  RS: BUG: erst Resource ändern!
  10170.     dt%=CARD{VARPTR(dat$)+2}
  10171.     dt$=RIGHT$(n$+STR$(dt% AND 31),2)
  10172.     dt$=dt$+RIGHT$(n$+STR$((dt% DIV 32) AND 15),2)
  10173.     dt$=dt$+STR$(1980+((dt% DIV 512) AND 63))
  10174.     put_char(d.atei%,datdat&,dt$)
  10175.     put_char(d.atei%,dattime&,tm$)
  10176.     ' ------------------------
  10177.     box_draw(d.atei%)
  10178.     ex_obj&=@form_do(d.atei%) AND &HFF
  10179.     box_undraw(d.atei%)
  10180.     clr_state(d.atei%,ex_obj&,1)
  10181.     clr_flags(d.atei%,datsegm&,&H80)
  10182.     clr_flags(d.atei%,datramk&,&H80)
  10183.     set_flags(d.atei%,dath4&,8)
  10184.     '
  10185.     IF ex_obj&=datok&                   ! schreiben?
  10186.       a$=@get_char$(d.atei%,datdat&)    ! Date generieren
  10187.       b$=@get_char$(d.atei%,dattime&)   ! Time ...
  10188.       tm%=VAL(LEFT$(b$,2))*2048+VAL(MID$(b$,3,2))*32+VAL(MID$(b$,5,2))/2
  10189.       CARD{VARPTR(dat$)}=tm%
  10190.       dt%=VAL(MID$(a$,1,2))+VAL(MID$(a$,3,2))*32+(VAL(MID$(a$,5,4))-1980)*512
  10191.       CARD{VARPTR(dat$)+2}=dt%
  10192.       '
  10193.       fhandle%=@fopen(fi$,0)            ! Datei nochmal öffnen
  10194.       IF fhandle%>0
  10195.         ~@fdatime(VARPTR(dat$),fhandle%,1) ! Zeit+Datum setzen
  10196.         '
  10197.         IF CVI(bra$)=&H601A             ! Programmdatei?
  10198.           CLR a%                        ! Header bearbeiten
  10199.           j&=dath1&
  10200.           FOR i%=0 TO 7
  10201.             IF (OB_STATE(d.atei%,j&) AND 2)>0 AND i%<>3
  10202.               a%=a% OR 2^i%
  10203.             ENDIF
  10204.             INC j&
  10205.           NEXT i%
  10206.           '
  10207.           b%=@get_val(d.atei%,dath4&)
  10208.           b%=SHL(b%,28)
  10209.           a%=(a% AND &HFFFFFFF) OR b%
  10210.           ' ----------------
  10211.           ~@fseek(22,fhandle%,0)        ! Pointer auf Datei-Headerbits
  10212.           IF a%<>d.header%              ! wenn sich was geändert hat
  10213.             IF (d.attr% AND 1)<>0       ! STATUS: NUR LESEN?
  10214.               ~@alrt(3,"Datei hat Status 'NUR LESEN'! ",1,"Abbruch")
  10215.             ELSE
  10216.               fwrite(fhandle%,MKL$(a%)) ! sonst schreiben
  10217.             ENDIF
  10218.           ENDIF
  10219.         ENDIF
  10220.         ~@fclose(fhandle%)              ! Datei schließen
  10221.       ENDIF
  10222.       ' --------------------------
  10223.       CLR a%                            ! Jetzt Attribut bearbeiten
  10224.       j&=dat1&
  10225.       FOR i%=0 TO 5
  10226.         IF (OB_STATE(d.atei%,j&) AND 2)<>0
  10227.           a%=a% OR 2^i%
  10228.         ENDIF
  10229.         INC j&
  10230.       NEXT i%
  10231.       IF a%<>d.attr%                    ! was geändert?
  10232.         d.attr%=a%
  10233.         ~@fattrib(fi$,d.attr%,1)        ! Attribut setzen
  10234.       ENDIF
  10235.       ' ----------------
  10236.       a$=@get_char$(d.atei%,datname&)   ! Falls Datei gerade offen,
  10237.       fil$=@nam_conv$(a$,0)
  10238.       new$=path$+fil$
  10239.       IF new$<>fi$
  10240.         IF (d.attr% AND &H18)=8         ! Datenträgername
  10241.           a%=@fcreate(new$,8)
  10242.           IF a%>0
  10243.             ~@fclose(a%)
  10244.           ENDIF
  10245.         ELSE
  10246.           a%=@frename(fi$,new$)
  10247.         ENDIF
  10248.         IF a%=0 AND fi$=fi_o$
  10249.           fi_o$=new$
  10250.           do_list
  10251.         ENDIF
  10252.       ENDIF
  10253.       ' --------------------------
  10254.     ENDIF
  10255.   UNTIL 1
  10256.   lesen
  10257.   do_list
  10258. RETURN
  10259. '
  10260. ' ---------------------- Proceduren für DIR --------------------
  10261. PROCEDURE dir_secsearch
  10262.   .| Glob. Var.: drive%,fi$,fld$,fac$,pfad$,mode%,d.isk%,total%,cl%,lgs%,spc%
  10263.   .|     anf_dat%,bb$,bps%,fil$,buf%,aa%,ed%,z%,wzb%,yt%,xt%,hex!,anf_fat2%
  10264.   .|     len_fat%
  10265.   .| Felder    : file$(),cluster%(),whdl&()
  10266.   .| Ruft auf  : change_pfad,fsel$,chk_drv,get_fld_name$,find_files,nam_conv$
  10267.   .|     lesen,read_in_fat,dec,set_tz,alrt,wind_top,do_list
  10268.   .| Aufruf in : menu_mess-1,
  10269.   LOCAL b%,i%,j%,f1$
  10270.   '
  10271.   change_pfad(19,drive%)
  10272.   fi$=@fsel$("*.*","","Beliebiges Verzeichnis",19)   ! sucht Verzeichnissektor
  10273.   IF LEN(fi$)>0                 ! der eine bestimmte Datei oder Ordner
  10274.     ~@chk_drv(fi$)              ! enthält.
  10275.     fld$=@get_fld_name$(fi$)
  10276.     IF LEN(fld$)>0
  10277.       fac$=fld$
  10278.       i%=LEN(pfad$)-1
  10279.       WHILE MID$(pfad$,i%,1)<>"\" AND i%>0
  10280.         DEC i%
  10281.       WEND
  10282.       fac$=LEFT$(pfad$,i%)+fac$
  10283.       find_files
  10284.       mode%=d.isk%
  10285.       '
  10286.       CLR j%
  10287.       REPEAT
  10288.         EXIT IF fac$=file$(j%)
  10289.         INC j%
  10290.       UNTIL j%>total%
  10291.       IF j%<total%
  10292.         CLR b%
  10293.         cl%=cluster%(j%)
  10294.         lgs%=(cl%-2)*spc%+anf_dat%
  10295.         IF RIGHT$(fi$,1)<>"\"
  10296.           bb$=STRING$(bps%*2,0)
  10297.           fi$=LEFT$(fi$,LEN(fi$))
  10298.           f1$=RIGHT$(fi$,LEN(fi$)-RINSTR(fi$,"\"))
  10299.           fil$=@nam_conv$(f1$,1)
  10300.           DO
  10301.             lgs%=(cl%-2)*spc%+anf_dat%
  10302.             lesen
  10303.             BMOVE buf%,V:bb$,bps%
  10304.             INC lgs%
  10305.             lesen
  10306.             BMOVE buf%,V:bb$+bps%,bps%
  10307.             '
  10308.             b%=INSTR(bb$,fil$)
  10309.             EXIT IF b%>0
  10310.             aa%=@read_in_fat(cl%)
  10311.             EXIT IF aa%>=ed%-7
  10312.             cl%=aa%
  10313.           LOOP
  10314.         ENDIF
  10315.         '
  10316.         IF b%>0
  10317.           DEC b%
  10318.           IF b%>bps%-1
  10319.             SUB b%,bps%
  10320.           ELSE
  10321.             dec
  10322.             BMOVE V:bb$,buf%,bps%
  10323.           ENDIF
  10324.           z%=INT(b%/wzb%)*wzb%  ! Cursor ausrichten
  10325.           b%=b%-z%
  10326.           yt%=b%/16
  10327.           xt%=b%-yt%*16+51
  10328.           IF hex!=TRUE
  10329.             xt%=(b%-yt%*16)*3
  10330.           ENDIF
  10331.           set_tz
  10332.         ENDIF
  10333.       ELSE
  10334.         CLR lgs%
  10335.         ~@alrt(3,"Fehler aufgetreten!|Ordner nicht gefunden!",1,"Abbruch")
  10336.       ENDIF
  10337.     ELSE
  10338.       lgs%=anf_fat2%+len_fat%
  10339.     ENDIF
  10340.     wind_top(whdl&(0))
  10341.     lesen
  10342.     do_list
  10343.   ENDIF
  10344. RETURN
  10345. '
  10346. PROCEDURE dir_files
  10347.   .| Glob. Var.: erg%,total%,n$
  10348.   .| Felder    : file$(),cluster%(),att%(),laenge%()
  10349.   .| Ruft auf  : find_files,do_clr_out,mtasse,out,dec_hex_val$,out_do,set_last
  10350.   .|     mnorm
  10351.   .| Aufruf in : menu_mess-1,
  10352.   LOCAL i%,j%,b%,fld%,nm%,a$,b$,c$,folder$
  10353.   '
  10354.   find_files
  10355.   erg%=3
  10356.   do_clr_out("    Name          Cluster  Attribut  Länge")
  10357.   mtasse
  10358.   CLR j%,nm%,fld%,folder$
  10359.   IF total%>0
  10360.     FOR i%=1 TO total%
  10361.       INC j%
  10362.       CLR c$
  10363.       b%=RINSTR(file$(i%),"\")
  10364.       '
  10365.       IF LEFT$(file$(i%),b%)<>folder$
  10366.         out(LEFT$(file$(i%),b%))
  10367.         folder$=LEFT$(file$(i%),b%)
  10368.         INC fld%
  10369.       ENDIF
  10370.       '
  10371.       b$=STRING$(46,32)
  10372.       MID$(b$,5)=RIGHT$(file$(i%),LEN(file$(i%))-b%)
  10373.       MID$(b$,19)=@dec_hex_val$(cluster%(i%),6)
  10374.       MID$(b$,28)=RIGHT$(n$+BIN$(att%(i%)),8)
  10375.       MID$(b$,38)=@dec_hex_val$(laenge%(i%),8)
  10376.       IF (att%(i%) AND 16)<>0
  10377.         c$="  Folder"
  10378.       ELSE IF (att%(i%) AND 8)<>0
  10379.         nm%=1
  10380.         c$="  Label"
  10381.       ELSE IF (att%(i%) AND 7)<>0
  10382.         c$="  ???"
  10383.       ENDIF
  10384.       out(b$+c$)
  10385.     NEXT i%
  10386.     out("")
  10387.     DEC fld%
  10388.     a$="Files "+RIGHT$(n$+STR$(j%-fld%-nm%),4)
  10389.     out(a$+" Ordner "+RIGHT$(n$+STR$(fld%),4))
  10390.     out_do
  10391.     set_last(3)
  10392.   ENDIF
  10393.   mnorm
  10394. RETURN
  10395. PROCEDURE last_3
  10396.   .| Glob. Var.: txt_zeile%,top%,total%,txt_spalte%,txt_links%,lgs%,spc%
  10397.   .|     anf_dat%
  10398.   .| Felder    : cluster%(),whdl&(),att%(),file$()
  10399.   .| Ruft auf  : liste_durchgehen,set_w,wind_top,do_datei_info,alrt
  10400.   .| Aufruf in : maus_pos-1,
  10401.   LOCAL a%
  10402.   a%=@liste_durchgehen(txt_zeile%+top%)         ! Dateinamen ermitteln
  10403.   IF a%<=total%
  10404.     IF txt_spalte%+txt_links%>18
  10405.       lgs%=(cluster%(a%)-2)*spc%+anf_dat%
  10406.       set_w
  10407.       wind_top(whdl&(0))
  10408.     ELSE
  10409.       ' RS: Test: Namen lassen sich ändern. Mit BigDOS auch Zeit und Hidden-/System-Attribut.
  10410.       ' IF (att%(a%) AND (16+8))=0
  10411.       do_datei_info(file$(a%))
  10412.       ' ELSE
  10413.       '  ~@alrt(1,"Das geht nur mit Dateien!",1," Aha ")
  10414.       ' ENDIF
  10415.     ENDIF
  10416.   ENDIF
  10417. RETURN
  10418. '
  10419. ' dir_fldren: Ordner umbenennen
  10420. ' Holt per Fileselektor einen Ordnernamen und erlaubt, den
  10421. ' Ordner umzubenennen. Schaltet in den Diskmodus und stellt
  10422. ' eventuell auf anderes Laufwerk um.
  10423. PROCEDURE dir_fldren
  10424.   .| Glob. Var.: drive%,bps%,spc%,total%,cl%,lgs%,ab%,status%,el%,find%
  10425.   .| Felder    : att%(),cluster%(),file$(),sec%()
  10426.   .| Ruft auf  : change_pfad,fsel$,media,chk_drv,find_files,disc_on
  10427.   .|     get_fld_name$,suche_in_liste,nam_conv$,err_inf,mnorm,einname,lesen
  10428.   .|     do_list
  10429.   .| Aufruf in : menu_mess-1,
  10430.   LOCAL i%,a$,bb$,fi$,fld$,folder$
  10431.   '
  10432.   change_pfad(20,drive%)                      ! In Pfad Nummer 20 Laufwerk umstellen
  10433.   fi$=@fsel$("*.*","","Ordner umbenennen",20) ! Fileselektor aufrufen, Zielpfad holen
  10434.   IF fi$<>""
  10435.     IF @media(drive%)=0                       ! Auf Laufwerk drive% Wechsel auslösen
  10436.       ~@chk_drv(fi$)                          ! Eventuell auf neues Laufwerk umstellen
  10437.       bb$=STRING$(bps%*spc%,0)                ! Clusterpuffer anlegen
  10438.       find_files                              ! Dateibaum durchsuchen
  10439.       disc_on                                 ! In Diskmodus umschalten
  10440.       fld$=@get_fld_name$(fi$)                ! Ordnernamen holen aus Pfadnamen
  10441.       a$=LEFT$(fi$,LEN(fi$)-1)                ! Backslash am Ende entfernen
  10442.       i%=@suche_in_liste(LEFT$(a$,RINSTR(a$,"\"))+fld$)
  10443.       '
  10444.       IF i%<=total% AND (att%(i%) AND 16)<>0
  10445.         cl%=cluster%(i%)                      ! Cluster des Ordners holen
  10446.         a$=file$(i%)                          ! Dateiname holen
  10447.         a$=RIGHT$(a$,LEN(a$)-RINSTR(a$,"\"))  ! Pfadanteil wegfiltern
  10448.         folder$=@nam_conv$(a$,1)              ! Pfadname
  10449.         lgs%=sec%(i%)                         ! Sektor, in dem Ordner steht
  10450.         '
  10451.         CLR ab%
  10452.         status%=@rwabs(0,V:bb$,spc%,lgs%,drive%) ! Cluster lesen
  10453.         err_inf(status%)
  10454.         mnorm
  10455.         i%=1
  10456.         WHILE i%<bps%*spc%-32 AND ab%=0       ! Cluster nach Einträgen absuchen
  10457.           EXIT IF ASC(MID$(bb$,i%,1))=0       ! letzter Eintrag (beginnt mit 0)
  10458.           '
  10459.           IF MID$(bb$,i%,11)=folder$          ! Ist das unser Ordner?
  10460.             einname("Neuer Ordnername",folder$) ! Neuen Namen eingeben lassen
  10461.             IF el%>0
  10462.               MID$(bb$,i%,11)=@nam_conv$(a$,1)
  10463.               CLR find%
  10464.               status%=@rwabs(1,V:bb$,spc%,lgs%,drive%) ! Cluster schreiben
  10465.               err_inf(status%)
  10466.             ENDIF
  10467.             ab%=1                             ! gefunden
  10468.           ENDIF
  10469.           '
  10470.           ADD i%,32                           ! nächster Eintrag
  10471.         WEND
  10472.       ENDIF
  10473.       lesen
  10474.       do_list
  10475.     ENDIF
  10476.   ENDIF
  10477. RETURN
  10478. PROCEDURE dir_root
  10479.   .| Glob. Var.: mode%,d.isk%,lgs%,anf_fat2%,len_fat%,z%,xt%,yt%,tz%,hex!
  10480.   .| Ruft auf  : change,lesen,do_list
  10481.   .| Aufruf in : menu_mess-1,
  10482.   IF mode%=d.isk%
  10483.     change
  10484.     lgs%=anf_fat2%+len_fat%
  10485.     lesen
  10486.     CLR z%,xt%,yt%,tz%
  10487.     hex!=TRUE
  10488.     do_list
  10489.   ENDIF
  10490. RETURN
  10491. '
  10492. PROCEDURE dir_sort
  10493.   .| Glob. Var.: drive%,fi$,fld$,total%,lgs%,cl%,spc%,anf_dat%,msflag%
  10494.   .|     anf_fat2%,len_fat%,len_dir%,mlgs%,anz%,aa%,zg%,jc%,mssec%,bps%,ed%
  10495.   .|     mode%,d.isk%,anz_sec%,out%,buf%,sel_buf$,sel$,erg%
  10496.   .| Felder    : cluster%()
  10497.   .| Ruft auf  : change_pfad,fsel$,chk_drv,get_fld_name$,bios_block,find_files
  10498.   .|     suche_in_liste,alrt,lesen,dir_sort_lgs,clr_out,nam_conv$,out,out_do
  10499.   .|     set_last
  10500.   .| Aufruf in : menu_mess-1,
  10501.   LOCAL i%,a$
  10502.   '
  10503.   change_pfad(21,drive%)
  10504.   fi$=@fsel$("*.*","","DIR - SORT",21)
  10505.   IF RIGHT$(fi$)="\"
  10506.     ~@chk_drv(fi$)
  10507.     fld$=@get_fld_name$(fi$)
  10508.     bios_block(drive%)
  10509.     IF LEN(fld$)>0
  10510.       CLR i%                    ! keine Datei
  10511.       find_files
  10512.       a$=LEFT$(fi$,LEN(fi$)-1)
  10513.       i%=@suche_in_liste(LEFT$(a$,RINSTR(a$,"\"))+fld$)
  10514.       IF i%>total%
  10515.         ~@alrt(3,"Ordner nicht gefunden!",1," Dumm ")
  10516.         CLR lgs%
  10517.       ELSE
  10518.         cl%=cluster%(i%)
  10519.         lgs%=(cl%-2)*spc%+anf_dat%
  10520.       ENDIF
  10521.       msflag%=-1
  10522.     ELSE
  10523.       lgs%=anf_fat2%+len_fat%           ! Anfang Wurzelverzeichnis
  10524.       msflag%=len_dir%
  10525.     ENDIF
  10526.     WHILE lgs%
  10527.       mlgs%=lgs%
  10528.       lesen
  10529.       anz%=1
  10530.       CLR aa%,zg%,jc%
  10531.       mssec%=msflag%
  10532.       DO
  10533.         INC anz%
  10534.         ADD zg%,32
  10535.         EXIT IF zg%>=bps% AND aa%>=ed%
  10536.         IF zg%>=bps%
  10537.           INC jc%
  10538.           IF jc%>=spc% AND msflag%=-1
  10539.             lgs%=@dir_sort_lgs(lgs%)
  10540.             CLR jc%                     ! Sektoren-Cluster Zähler
  10541.           ELSE
  10542.             INC lgs%
  10543.             DEC mssec%
  10544.             IF mssec%=0
  10545.               aa%=ed%
  10546.             ENDIF
  10547.           ENDIF
  10548.           CLR zg%
  10549.         ENDIF
  10550.         EXIT IF aa%>=ed%
  10551.       LOOP
  10552.       '
  10553.       IF DIM?(fs$())
  10554.         ERASE fs$()
  10555.       ENDIF
  10556.       DIM fs$(anz%+1)
  10557.       mode%=d.isk%
  10558.       '
  10559.       clr_out("")
  10560.       CLR zg%,jc%,aa%
  10561.       lgs%=mlgs%
  10562.       anz_sec%=1
  10563.       lesen
  10564.       '
  10565.       mssec%=msflag%
  10566.       DO
  10567.         fs$(out%)=STRING$(32,0)         ! DIR - Eintrag
  10568.         BMOVE buf%+zg%,V:fs$(out%),32   ! kopieren
  10569.         IF BYTE{buf%+zg%}>0 AND BYTE{buf%+zg%}<>&HE5    ! ist Datei ungelöscht?
  10570.           a$=LEFT$(fs$(out%),11)                        ! ja,
  10571.           IF ASC(a$)<>46                                ! "." oder ".."?
  10572.             a$=@nam_conv$(a$,0)                         ! ok, konvertiere
  10573.           ENDIF
  10574.           IF (BYTE{buf%+zg%+11} AND 16)                 ! Ordner?
  10575.             a$="❎ "+a$                                  ! ja, kennzeichnen
  10576.           ELSE
  10577.             a$="  "+a$
  10578.           ENDIF
  10579.           out(a$)                                       ! und auf Bildschirm
  10580.         ENDIF
  10581.         ADD zg%,32                                      ! nächster Eintrag
  10582.         '
  10583.         EXIT IF zg%>=bps% AND aa%>=ed%                  ! Sektor fertig?
  10584.         IF zg%>=bps%
  10585.           INC jc%                                       ! ja,
  10586.           IF jc%>=spc% AND msflag%=-1
  10587.             lgs%=@dir_sort_lgs(lgs%)                    ! nächsten
  10588.             CLR jc%
  10589.           ELSE
  10590.             INC lgs%
  10591.             DEC mssec%
  10592.             IF mssec%=0
  10593.               aa%=ed%
  10594.             ENDIF
  10595.           ENDIF
  10596.           IF aa%<ed%
  10597.             INC anz_sec%
  10598.             lesen                                       ! lesen
  10599.           ENDIF
  10600.           CLR zg%
  10601.         ENDIF
  10602.         EXIT IF aa%>=ed%
  10603.       LOOP
  10604.       CLR sel_buf$,sel$
  10605.       erg%=3
  10606.       out_do
  10607.       set_last(12)
  10608.       EXIT IF 1
  10609.     WEND
  10610.   ENDIF
  10611. RETURN
  10612. PROCEDURE last_12
  10613.   .| Glob. Var.: ev_clicks&,wa$,lgs%,mlgs%,b%,zg%,jc%,aa%,anz%,mssec%,msflag%
  10614.   .|     buf%,bps%,ed%,spc%,out%,a$,anz_sec%
  10615.   .| Felder    : fs$()
  10616.   .| Ruft auf  : maus_sort,alrt,lesen,schreiben,dir_sort_lgs,do_list
  10617.   .| Aufruf in : maus_pos-1,
  10618.   IF ev_clicks&=1
  10619.     maus_sort
  10620.   ELSE
  10621.     IF @alrt(2,"Neue Reihenfolge schreiben? ",0,wa$)=1
  10622.       lgs%=mlgs%
  10623.       lesen
  10624.       CLR b%,zg%,jc%,aa%
  10625.       anz%=1
  10626.       IF LEFT$(fs$(anz%),11)=SPACE$(11)
  10627.         INC anz%
  10628.       ENDIF
  10629.       '
  10630.       mssec%=msflag%
  10631.       REPEAT
  10632.         BMOVE V:fs$(anz%),buf%+zg%,32     ! Eintrag in Puffer schreiben
  10633.         INC anz%
  10634.         ADD zg%,32
  10635.         EXIT IF zg%>=bps% AND aa%>=ed%
  10636.         IF zg%>=bps%                      ! Wenn Puffer voll ist
  10637.           INC b%
  10638.           schreiben                       ! dann schreiben
  10639.           INC jc%
  10640.           IF jc%>=spc% AND msflag%=-1
  10641.             lgs%=@dir_sort_lgs(lgs%)
  10642.             CLR jc%
  10643.           ELSE
  10644.             INC lgs%
  10645.             DEC mssec%
  10646.             IF mssec%=0
  10647.               aa%=ed%
  10648.             ENDIF
  10649.           ENDIF
  10650.           IF aa%<ed%
  10651.             lesen                         ! nächsten Lesen
  10652.           ENDIF
  10653.           CLR zg%
  10654.         ENDIF
  10655.       UNTIL anz%>out%             ! bis alle Einträge geschrieben
  10656.       '
  10657.       a$=STRING$(32,0)            ! den Rest des Puffers mit 00
  10658.       REPEAT                      ! füllen.
  10659.         WHILE zg%<bps%
  10660.           BMOVE V:a$,buf%+zg%,32
  10661.           ADD zg%,32
  10662.         WEND
  10663.         INC b%
  10664.         schreiben                 ! Puffer schreiben
  10665.         INC jc%
  10666.         IF jc%>=spc% AND msflag%=-1
  10667.           lgs%=@dir_sort_lgs(lgs%)
  10668.           CLR jc%
  10669.         ELSE
  10670.           INC lgs%
  10671.           DEC mssec%
  10672.           IF mssec%=0
  10673.             aa%=ed%
  10674.           ENDIF
  10675.         ENDIF
  10676.         lesen
  10677.         CLR zg%
  10678.       UNTIL b%>=anz_sec%          ! auch die restlichen Sektoren
  10679.     ENDIF
  10680.     lgs%=mlgs%                    ! ersten DIR-Sektor lesen
  10681.     lesen                         ! und anzeigen
  10682.     do_list
  10683.   ENDIF
  10684. RETURN
  10685. FUNCTION dir_sort_lgs(lgs%)
  10686.   .| Glob. Var.: cl%,anf_dat%,spc%,aa%
  10687.   .| Ruft auf  : read_in_fat
  10688.   .| Aufruf in : dir_sort-2,last_12-2,
  10689.   cl%=INT((lgs%-anf_dat%)/spc%)+2
  10690.   aa%=@read_in_fat(cl%)
  10691.   RETURN (aa%-2)*spc%+anf_dat%
  10692. ENDFUNC
  10693. PROCEDURE maus_sort
  10694.   .| Glob. Var.: wahl%,txt_zeile%,top%,sel_buf$,out%,sel$,i%
  10695.   .| Felder    : out$(),fs$()
  10696.   .| Ruft auf  : do_list
  10697.   .| Aufruf in : last_12-1,
  10698.   wahl%=txt_zeile%+top%
  10699.   IF sel_buf$=""
  10700.     IF wahl%<out%
  10701.       sel_buf$=out$(wahl%)
  10702.       out$(0)=out$(wahl%)
  10703.       sel$=fs$(wahl%)
  10704.       FOR i%=wahl% TO out%
  10705.         fs$(i%)=fs$(i%+1)
  10706.         out$(i%)=out$(i%+1)
  10707.       NEXT i%
  10708.       fs$(out%)=""
  10709.       out$(out%)=""
  10710.       DEC out%
  10711.       do_list
  10712.     ENDIF
  10713.   ELSE
  10714.     IF wahl%<out%+1 AND wahl%>0
  10715.       INC out%
  10716.       FOR i%=out% DOWNTO wahl%
  10717.         fs$(i%)=fs$(i%-1)
  10718.         out$(i%)=out$(i%-1)
  10719.       NEXT i%
  10720.       fs$(wahl%)=sel$
  10721.       out$(wahl%)=sel_buf$
  10722.       CLR sel_buf$,sel$
  10723.       out$(0)=""
  10724.       do_list
  10725.     ENDIF
  10726.   ENDIF
  10727. RETURN
  10728. ' ---------------------- GEMDOS-Routinen -----------------------
  10729. FUNCTION fgetdta
  10730.   .| Aufruf in : disc_quick-1,datei_suchen-1,pfad_compare-1,
  10731.   RETURN GEMDOS(47)
  10732. ENDFUNC
  10733. FUNCTION dsetdrv(drive%)
  10734.   .| Glob. Var.: gm$
  10735.   .| Ruft auf  : err_inf1
  10736.   .| Aufruf in : media_all-1,sektor_compare-1,disc_info-1,disc_drive-1
  10737.   .|     set_pfad-1,
  10738.   LOCAL fehler%
  10739.   fehler%=GEMDOS(14,W:drive%)
  10740.   IF fehler%<0
  10741.     err_inf1(fehler%,"Dsetdrv: "+CHR$(drive%+65),gm$)
  10742.   ENDIF
  10743.   RETURN fehler%
  10744. ENDFUNC
  10745. FUNCTION dsetpath(df$)
  10746.   .| Glob. Var.: gm$
  10747.   .| Ruft auf  : err_inf1
  10748.   .| Aufruf in : disc_info-1,set_pfad-1,
  10749.   LOCAL fehler%
  10750.   df$=df$+CHR$(0)
  10751.   fehler%=GEMDOS(59,L:V:df$)
  10752.   IF fehler%<0
  10753.     err_inf1(fehler%,"Dsetpath: "+df$,gm$)
  10754.   ENDIF
  10755.   RETURN fehler%
  10756. ENDFUNC
  10757. FUNCTION frename(df$,df2$)
  10758.   .| Glob. Var.: gm$
  10759.   .| Ruft auf  : err_inf1,err_inf3
  10760.   .| Aufruf in : save_einstellungen-1,do_datei_info-1,
  10761.   LOCAL fehler%
  10762.   fehler%=GEMDOS(86,0,L:V:df$,L:V:df2$)
  10763.   IF fehler%<>0
  10764.     err_inf1(fehler%,"Frename: "+df$,gm$)
  10765.     err_inf3(fehler%,"         "+df2$,gm$)
  10766.   ENDIF
  10767.   RETURN fehler%
  10768. ENDFUNC
  10769. FUNCTION fdatime(df%,handle%,fmode%)
  10770.   .| Glob. Var.: gm$
  10771.   .| Ruft auf  : err_inf1
  10772.   .| Aufruf in : do_datei_info-2,
  10773.   LOCAL fehler%
  10774.   fehler%=GEMDOS(87,L:df%,W:handle%,W:fmode%)
  10775.   IF fehler%<>0
  10776.     err_inf1(fehler%,"Fdatime:",gm$)
  10777.   ENDIF
  10778.   RETURN fehler%
  10779. ENDFUNC
  10780. FUNCTION fattrib(df$,attr%,fmode%)
  10781.   .| Glob. Var.: gm$
  10782.   .| Ruft auf  : err_inf1
  10783.   .| Aufruf in : do_datei_info-2,fdelete-2,
  10784.   LOCAL fehler%
  10785.   df$=df$+CHR$(0)
  10786.   fehler%=GEMDOS(67,L:VARPTR(df$),fmode%,attr%)
  10787.   IF fehler%<0
  10788.     err_inf1(fehler%,"Fattrib: "+df$+" "+STR$(attr%),gm$)
  10789.   ENDIF
  10790.   RETURN fehler%
  10791. ENDFUNC
  10792. FUNCTION fcreate(name$,attr%)
  10793.   .| Glob. Var.: df$,gm$
  10794.   .| Ruft auf  : err_inf1
  10795.   .| Aufruf in : save_einstellungen-1,disc_info-1,do_file_copy-2,chk_create-1
  10796.   .|     chk_opn-1,
  10797.   LOCAL fehler%
  10798.   df$=name$+CHR$(0)
  10799.   fehler%=GEMDOS(60,L:V:df$,W:attr%)
  10800.   IF fehler%<0
  10801.     err_inf1(fehler%,"Fcreate: "+df$,gm$)
  10802.   ENDIF
  10803.   RETURN fehler%
  10804. ENDFUNC
  10805. FUNCTION fopen(df$,fmode%)
  10806.   .| Glob. Var.: gm$
  10807.   .| Ruft auf  : err_inf1
  10808.   .| Aufruf in : init_do-1,init_help-1,hard_restore-1,ram_load-1,disc_load-1
  10809.   .|     datei_concat-2,file_verify-2,do_file_copy-1,do_file_open-1
  10810.   .|     do_datei_info-2,do_in-1,printer-1,chk_opn-1,do_ascii-1,
  10811.   LOCAL fehler%
  10812.   '
  10813.   df$=df$+CHR$(0)
  10814.   fehler%=GEMDOS(61,L:V:df$,W:fmode%)
  10815.   IF fehler%<0
  10816.     err_inf1(fehler%,"Fopen: "+df$,gm$)
  10817.   ENDIF
  10818.   RETURN fehler%
  10819. ENDFUNC
  10820. FUNCTION fseek(offset%,handle%,modus%)
  10821.   .| Glob. Var.: gm$
  10822.   .| Ruft auf  : err_inf1
  10823.   .| Aufruf in : init_do-2,init_help-2,ram_load-2,disc_load-2,file_write-1
  10824.   .|     file_read-1,datei_concat-4,file_verify-4,do_file_copy-2
  10825.   .|     do_file_open-1,do_datei_info-3,do_in-2,search_lesen-1,chk_opn-1
  10826.   .|     do_ascii-2,
  10827.   LOCAL fehler%
  10828.   '
  10829.   fehler%=GEMDOS(66,L:offset%,W:handle%,W:modus%)
  10830.   IF fehler%<0
  10831.     err_inf1(fehler%,"Fseek:",gm$)
  10832.   ENDIF
  10833.   RETURN fehler%
  10834. ENDFUNC
  10835. FUNCTION fclose(handle%)
  10836.   .| Glob. Var.: gm$
  10837.   .| Ruft auf  : err_inf1
  10838.   .| Aufruf in : init_do-1,save_einstellungen-1,init_help-1,hard_save-1
  10839.   .|     hard_restore-1,ram_save-1,ram_load-1,disc_info-1,disc_load-1
  10840.   .|     file_close-1,datei_cut-2,datei_concat-3,file_verify-2,file_is_open-1
  10841.   .|     do_file_copy-4,do_datei_info-2,sav_buf-1,sav_block-1,do_in-1
  10842.   .|     look_ex-1,out_logbuch-1,log_out-1,chk_opn-1,do_ascii-1,fat_test-1,
  10843.   LOCAL fehler%
  10844.   '
  10845.   fehler%=GEMDOS(62,W:handle%)
  10846.   IF fehler%<0
  10847.     err_inf1(fehler%,"Fclose:",gm$)
  10848.   ENDIF
  10849.   RETURN fehler%
  10850. ENDFUNC
  10851. FUNCTION fdelete(df$)
  10852.   .| Glob. Var.: gm$
  10853.   .| Ruft auf  : fattrib,err_inf1
  10854.   .| Aufruf in : datei_del-1,chk_opn-1,
  10855.   LOCAL a%,fehler%
  10856.   df$=df$+CHR$(0)
  10857.   a%=@fattrib(df$,0,0)
  10858.   IF (a% AND 1)<>0       ! Schreibgeschützt?
  10859.     ~@fattrib(df$,(a% AND &HFE),1)
  10860.   ENDIF
  10861.   fehler%=GEMDOS(65,L:VARPTR(df$))
  10862.   IF fehler%<0
  10863.     err_inf1(fehler%,"Fdelete: "+df$,gm$)
  10864.   ENDIF
  10865.   RETURN fehler%
  10866. ENDFUNC
  10867. FUNCTION fread$(handle%,bytes%)
  10868.   .| Glob. Var.: buf$,fehler%
  10869.   .| Ruft auf  : freadf
  10870.   .| Aufruf in : init_do-1,ram_load-1,file_verify-4,do_datei_info-2,
  10871.   buf$=SPACE$(bytes%)
  10872.   fehler%=GEMDOS(63,W:handle%,L:bytes%,L:V:buf$)
  10873.   freadf
  10874.   RETURN buf$
  10875. ENDFUNC
  10876. '
  10877. PROCEDURE freadf
  10878.   .| Glob. Var.: fehler%,gm$,bytes%
  10879.   .| Ruft auf  : err_inf1
  10880.   .| Aufruf in : fread-1,fread2-1,
  10881.   IF fehler%<0
  10882.     err_inf1(fehler%,"Fread:",gm$)
  10883.   ENDIF
  10884.   IF fehler%<>bytes%
  10885.     err_inf1(fehler%,"Fread: Lesen",gm$)
  10886.   ENDIF
  10887. RETURN
  10888. PROCEDURE fread2(handle%,fread%,bytes%)
  10889.   .| Glob. Var.: fehler%
  10890.   .| Ruft auf  : freadf
  10891.   .| Aufruf in : init_help-1,hard_restore-2,ram_load-1,disc_load-1
  10892.   .|     file_read-1,datei_concat-4,do_file_copy-3,do_in-1,search_lesen-2
  10893.   .|     do_ascii-1,
  10894.   fehler%=GEMDOS(63,W:handle%,L:bytes%,L:fread%)
  10895.   freadf
  10896. RETURN
  10897. PROCEDURE fwrite(handle%,buf$)
  10898.   .| Glob. Var.: fehler%
  10899.   .| Ruft auf  : fwritef
  10900.   .| Aufruf in : ram_save-2,do_datei_info-1,look_ex-1,
  10901.   fehler%=GEMDOS(64,handle%,L:LEN(buf$),L:V:buf$)
  10902.   fwritef
  10903. RETURN
  10904. PROCEDURE fwritef
  10905.   .| Glob. Var.: fehler%,buf$,gm$
  10906.   .| Ruft auf  : err_inf1
  10907.   .| Aufruf in : fwrite-1,fwritec-1,
  10908.   IF fehler%=0 OR fehler%<>LEN(buf$)
  10909.     err_inf1(fehler%,"Fwrite:",gm$)
  10910.     fehler%=-1
  10911.   ENDIF
  10912. RETURN
  10913. PROCEDURE fwritec(handle%,buf$)
  10914.   .| Glob. Var.: cr$,fehler%
  10915.   .| Ruft auf  : fwritef
  10916.   .| Aufruf in : save_einstellungen-28,out_do-1,out_sed-1,file_dump-3
  10917.   .|     sav_buf-2,sav_block-2,print_buf-1,print_blk-1,do_dump-1,text_dev-5,
  10918.   buf$=buf$+cr$                         ! Text schreiben + CR+LF
  10919.   fehler%=GEMDOS(64,handle%,L:LEN(buf$),L:V:buf$)
  10920.   fwritef
  10921. RETURN
  10922. PROCEDURE fwrite2(handle%,fw%,fz%)
  10923.   .| Glob. Var.: fehler%,gm$
  10924.   .| Ruft auf  : err_inf1
  10925.   .| Aufruf in : hard_save-2,disc_save-1,file_write-1,datei_cut-4
  10926.   .|     datei_concat-4,do_file_copy-3,sav_buf-1,sav_block-1,log_out-1
  10927.   .|     fat_get_leiche-1,
  10928.   fehler%=GEMDOS(64,handle%,L:fz%,L:fw%)
  10929.   IF fehler%=0 OR fehler%<>fz%
  10930.     err_inf1(fehler%,"Fwrite:",gm$)
  10931.   ENDIF
  10932. RETURN
  10933. ' ----------------------
  10934. PROCEDURE lies_all(p$)                ! sucht alle Dateien (außer LABEL)
  10935.   .| Glob. Var.: dta%,dta$,lies_mode%,abb%
  10936.   .| Ruft auf  : lies_all,lies_1,dum,lies_3,lies_4
  10937.   .| Aufruf in : disc_quick-1,datei_suchen-1,pfad_compare-1,lies_all-1,
  10938.   LOCAL f$,all$,nr%,i%
  10939.   CLR nr%
  10940.   all$=p$+"*.*"+CHR$(0)
  10941.   IF GEMDOS(78,L:VARPTR(all$),&X110111)=0     ! Fsfirst
  10942.     REPEAT
  10943.       BMOVE dta%,V:dta$,44
  10944.       INC nr%
  10945.       f$=MID$(dta$,31,INSTR(31,dta$,CHR$(0))-31)
  10946.       IF (ASC(MID$(dta$,22,1)) AND 16)<>0  ! Ordner?
  10947.         IF ASC(f$)<>46                  ! kein "." oder ".."
  10948.           lies_all(p$+f$+"\")
  10949.           i%=1
  10950.           ~GEMDOS(78,L:VARPTR(all$),&X110111)
  10951.           WHILE i%<nr%
  10952.             ~GEMDOS(79)                 ! Fsnext
  10953.             INC i%
  10954.           WEND
  10955.         ENDIF
  10956.       ELSE
  10957.         ON lies_mode% GOSUB lies_1,dum,lies_3,lies_4
  10958.       ENDIF
  10959.       EXIT IF abb%>0
  10960.     UNTIL GEMDOS(79)
  10961.   ENDIF
  10962. RETURN
  10963. ' ---------------------- OUT Puffer(Block) -------------
  10964. PROCEDURE sav_buf             ! Puffer auf Disc
  10965.   .| Glob. Var.: device%,erg%,hdl%,buf%,l_end%,info_line$
  10966.   .| Felder    : l_end%()
  10967.   .| Ruft auf  : dump_data,dev,mtasse,fwrite2,fclose,out_sed,info,fwritec
  10968.   .|     do_dump,look_ex,mnorm
  10969.   .| Aufruf in : dat_sichern_als-1,
  10970.   LOCAL was%,a$
  10971.   '
  10972.   was%=@dump_data
  10973.   CLR device%
  10974.   erg%=1
  10975.   a$="Puffer ausgeben - "
  10976.   IF was%>0
  10977.     dev(a$+"DATA",38)
  10978.   ELSE
  10979.     dev(a$+"DUMP",39)
  10980.   ENDIF
  10981.   IF device%<>99
  10982.     mtasse
  10983.     IF was%>0                   ! Datas
  10984.       fwrite2(hdl%,buf%,l_end%)
  10985.       ~@fclose(hdl%)
  10986.     ELSE                        ! DUMP
  10987.       out_sed(hdl%)
  10988.       info
  10989.       fwritec(hdl%,info_line$)
  10990.       fwritec(hdl%,STRING$(75,"-"))
  10991.       do_dump(0,l_end%(0))
  10992.       look_ex
  10993.     ENDIF
  10994.   ENDIF
  10995.   mnorm
  10996. RETURN
  10997. PROCEDURE sav_block           ! Block  auf Disc
  10998.   .| Glob. Var.: erg%,device%,hdl%,buf%,buf_beg%,buf_end%,info_line$
  10999.   .| Ruft auf  : dump_data,dev,mtasse,fwrite2,fclose,out_sed,info,fwritec
  11000.   .|     do_dump,look_ex,mnorm
  11001.   .| Aufruf in : dat_sichern_als-1,
  11002.   LOCAL i%,a%,was%,a$
  11003.   '
  11004.   was%=@dump_data
  11005.   erg%=1
  11006.   a$="Block sichern - "
  11007.   IF was%>0
  11008.     dev(a$+"DATA",40)
  11009.   ELSE
  11010.     dev(a$+"DUMP",41)
  11011.   ENDIF
  11012.   IF device%<>99
  11013.     mtasse
  11014.     IF was%>0
  11015.       fwrite2(hdl%,buf%+buf_beg%,buf_end%-buf_beg%)
  11016.       ~@fclose(hdl%)
  11017.     ELSE
  11018.       out_sed(hdl%)
  11019.       info
  11020.       fwritec(hdl%,info_line$)
  11021.       fwritec(hdl%,STRING$(75,"-"))
  11022.       do_dump(buf_beg%,buf_end%-buf_beg%+1)
  11023.       look_ex
  11024.     ENDIF
  11025.   ENDIF
  11026.   mnorm
  11027. RETURN
  11028. PROCEDURE print_buf           ! Puffer auf Drucker
  11029.   .| Glob. Var.: erg%,device%,hdl%,info_line$
  11030.   .| Felder    : l_end%()
  11031.   .| Ruft auf  : dev,out_sed,info,fwritec,do_dump,look_ex
  11032.   .| Aufruf in : dat_drucken-1,
  11033.   erg%=2
  11034.   dev("Puffer drucken",42)
  11035.   IF device%<>99
  11036.     out_sed(hdl%)
  11037.     info
  11038.     fwritec(hdl%,info_line$)
  11039.     do_dump(0,l_end%(0))
  11040.     look_ex
  11041.   ENDIF
  11042. RETURN
  11043. PROCEDURE print_blk           ! Block  auf Drucker
  11044.   .| Glob. Var.: erg%,device%,hdl%,info_line$,buf_beg%,buf_end%
  11045.   .| Ruft auf  : dev,mtasse,out_sed,info,fwritec,do_dump,look_ex
  11046.   .| Aufruf in : dat_drucken-1,
  11047.   erg%=2
  11048.   dev("Block drucken",43)
  11049.   IF device%<>99
  11050.     mtasse
  11051.     out_sed(hdl%)
  11052.     info
  11053.     fwritec(hdl%,info_line$)
  11054.     do_dump(buf_beg%,buf_end%-buf_beg%)
  11055.     look_ex
  11056.   ENDIF
  11057. RETURN
  11058. PROCEDURE do_dump(sav_beg%,sav_anz%)
  11059.   .| Glob. Var.: offset%,fp%,ram_addr%,buf%,j%,hdl%,abb%
  11060.   .| Ruft auf  : dec_hex_val$,fwritec,was_ist
  11061.   .| Aufruf in : file_dump-1,sav_buf-1,sav_block-1,print_buf-1,print_blk-1,
  11062.   LOCAL a%,b%,c%,i%,zl%,o$,a$
  11063.   CLR zl%
  11064.   '
  11065.   c%=offset%+sav_beg%+fp%+ram_addr%
  11066.   REPEAT
  11067.     b%=buf%+sav_beg%+zl%*16
  11068.     j%=1
  11069.     o$=SPACE$(65)
  11070.     FOR i%=1 TO MIN(16,sav_anz%)
  11071.       a%=BYTE{b%}
  11072.       MID$(o$,j%)=HEX$(a%,2)
  11073.       MID$(o$,i%+49,1)=CHR$(MAX(32,a%))
  11074.       INC b%
  11075.       ADD j%,3
  11076.     NEXT i%
  11077.     SUB sav_anz%,16
  11078.     a$=@dec_hex_val$(c%+zl%*16,8)+" "+o$
  11079.     fwritec(hdl%,a$)
  11080.     INC zl%
  11081.     abb%=@was_ist
  11082.   UNTIL sav_anz%<=0 OR abb%>0
  11083. RETURN
  11084. PROCEDURE to_blk_anf
  11085.   .| Glob. Var.: wind%,buf_beg%,tblkaz%,top%,txt_zeile%,txt_spalte%,tblkas%
  11086.   .| Felder    : wz%()
  11087.   .| Ruft auf  : coff,pos_cursor,do_list
  11088.   .| Aufruf in : menu_mess-1,
  11089.   coff
  11090.   IF wind%=0
  11091.     pos_cursor(buf_beg%)
  11092.   ELSE
  11093.     IF tblkaz%<top% OR tblkaz%>top%+wz%(wind%)
  11094.       top%=tblkaz%
  11095.       CLR txt_zeile%
  11096.     ELSE
  11097.       txt_zeile%=tblkaz%-top%
  11098.     ENDIF
  11099.     txt_spalte%=tblkas%
  11100.   ENDIF
  11101.   do_list
  11102. RETURN
  11103. PROCEDURE to_blk_end
  11104.   .| Glob. Var.: wind%,buf_end%,tblkez%,top%,txt_zeile%,txt_spalte%,tblkes%
  11105.   .| Felder    : wz%()
  11106.   .| Ruft auf  : coff,pos_cursor,do_list
  11107.   .| Aufruf in : menu_mess-1,
  11108.   coff
  11109.   IF wind%=0
  11110.     pos_cursor(buf_end%)
  11111.   ELSE
  11112.     IF tblkez%>top%+wz%(wind%) OR tblkez%<top%
  11113.       top%=tblkez%-wz%(wind%)+1
  11114.       txt_zeile%=wz%(wind%)-1
  11115.     ELSE
  11116.       txt_zeile%=tblkez%-top%
  11117.     ENDIF
  11118.     txt_spalte%=tblkes%+1
  11119.   ENDIF
  11120.   do_list
  11121. RETURN
  11122. '
  11123. PROCEDURE do_in(fi$,max_len%,wohin%)
  11124.   .| Glob. Var.: fhandle%,buf_beg%,buf_end%,old_p%,ch%
  11125.   .| Ruft auf  : fopen,fseek,fread2,fclose,set_stat,do_list
  11126.   .| Aufruf in : in_file-1,
  11127.   LOCAL a%
  11128.   IF EXIST(fi$)=TRUE
  11129.     fhandle%=@fopen(fi$,0)
  11130.     a%=@fseek(0,fhandle%,2)
  11131.     a%=MIN(max_len%,a%)
  11132.     CLR buf_beg%
  11133.     buf_end%=a%
  11134.     ~@fseek(0,fhandle%,0)
  11135.     fread2(fhandle%,wohin%,a%)
  11136.     ~@fclose(fhandle%)
  11137.     DEC old_p%
  11138.     INC ch%
  11139.     set_stat
  11140.     do_list
  11141.   ENDIF
  11142. RETURN
  11143. PROCEDURE in_file     ! Datei(stück) in Puffer einlesen (auch Cursorposition)
  11144.   .| Glob. Var.: fi$,wo%,buf%,tz%,z%,bps%
  11145.   .| Ruft auf  : fsel$,alrt,do_in,do_list
  11146.   .| Aufruf in : dat_lesen-1,
  11147.   fi$=@fsel$("*.*","","Puffer einlesen",24)
  11148.   IF fi$<>"" AND RIGHT$(fi$)<>"\"
  11149.     wo%=buf%
  11150.     IF tz%+z%<>0
  11151.       SELECT @alrt(2,"An Cursorposition ablegen?",1,"Ja|Nein|Abbruch")
  11152.       CASE 3
  11153.         wo%=-1
  11154.       CASE 1
  11155.         wo%=buf%+tz%+z%
  11156.       CASE 2
  11157.         wo%=buf%
  11158.       ENDSELECT
  11159.     ENDIF
  11160.     IF wo%>=0
  11161.       do_in(fi$,bps%-tz%-z%,wo%)
  11162.     ENDIF
  11163.     do_list
  11164.   ENDIF
  11165. RETURN
  11166. ' ---------------------- Tastatur ----------------------
  11167. PROCEDURE taste(key%,ev_ks&)
  11168.   .| Glob. Var.: low%,hi%,appl_id%,menu_pointer%,wind%,hex!,xt%,beg_ascii%
  11169.   .|     txt_spalte%,txt_links%,txt_zeile%,top%,wc%
  11170.   .| Felder    : whdl&(),out$()
  11171.   .| Ruft auf  : coff,menu_search,alt,control,tab,lend,up,set_slide,do_list
  11172.   .|     last_char,down,do_undo,edit_buf,cursor
  11173.   .| Aufruf in : message_auswerten-1,
  11174.   LOCAL a%,a$
  11175.   '
  11176.   low%=key% AND &HFF
  11177.   hi%=key% DIV &H100
  11178.   coff
  11179.   IF @menu_search(appl_id%,menu_pointer%,ev_ks&,key%)=0
  11180.     '                           ! wenn in MENU nichts gefunden
  11181.     IF (ev_ks& AND 8)<>0        ! = ALT
  11182.       alt(hi%,low%)
  11183.     ELSE
  11184.       IF (ev_ks& AND 4)<>0      ! = CTRL
  11185.         control(hi%,low%)
  11186.       ELSE
  11187.         IF (ev_ks& AND 3)<>0    ! = SHIFT links oder rechts oder beide
  11188.           SELECT hi%
  11189.           CASE 15
  11190.             tab
  11191.           CASE 71               ! HOME
  11192.             lend(wind%)
  11193.           CASE 72               ! SHIFT Cursor up
  11194.             up(wind%)
  11195.           CASE 75
  11196.             IF wind%=0
  11197.               IF hex!=FALSE     ! SHIFT+Cursor left
  11198.                 hex!=TRUE
  11199.                 xt%=(xt%-beg_ascii%)*3
  11200.               ENDIF
  11201.             ELSE
  11202.               txt_spalte%=1
  11203.               CLR txt_links%
  11204.               set_slide(whdl&(1))
  11205.               do_list
  11206.             ENDIF
  11207.           CASE 77
  11208.             IF wind%=0
  11209.               IF hex!=TRUE      ! SHIFT+Cursor right
  11210.                 hex!=FALSE
  11211.                 xt%=xt%/3+beg_ascii%
  11212.               ENDIF
  11213.             ELSE
  11214.               a$=out$(txt_zeile%+top%)
  11215.               a%=@last_char(a$)
  11216.               IF a%<wc%
  11217.                 txt_spalte%=a%
  11218.               ELSE
  11219.                 txt_links%=a%-wc%
  11220.                 txt_spalte%=wc%
  11221.               ENDIF
  11222.               set_slide(whdl&(1))
  11223.               do_list
  11224.             ENDIF
  11225.           CASE 80               ! SHIFT Cursor down
  11226.             @down(wind%)
  11227.           CASE 97               ! UNDO
  11228.             do_undo
  11229.           DEFAULT
  11230.             edit_buf(hi%,low%)  ! sonst Edit Buffer
  11231.           ENDSELECT
  11232.         ELSE
  11233.           SELECT low%
  11234.           CASE 0                ! Cursor- oder Sondertasten
  11235.             cursor(hi%,low%)
  11236.             '         CASE 27               ! ESC
  11237.             '            exit
  11238.           CASE 9                ! TAB
  11239.             IF wind%=0
  11240.               key%=5897         ! CTRL I emulieren
  11241.               ev_ks&=4
  11242.               ~@menu_search(appl_id%,menu_pointer%,ev_ks&,key%)
  11243.             ELSE
  11244.               tab
  11245.             ENDIF
  11246.           DEFAULT
  11247.             edit_buf(hi%,low%)  ! sonst Edit Buffer
  11248.           ENDSELECT
  11249.         ENDIF
  11250.       ENDIF
  11251.     ENDIF
  11252.   ENDIF
  11253. RETURN
  11254. PROCEDURE control(hi%,low%)
  11255.   .| Glob. Var.: out%,lgs%,wind%
  11256.   .| Ruft auf  : ctrl_tab,disass,out,do_list,log_out,next,opt_help,prev
  11257.   .|     edit_buf
  11258.   .| Aufruf in : taste-1,
  11259.   SELECT hi%
  11260.   CASE 15                       ! CTRL TAB
  11261.     ctrl_tab
  11262.   CASE 57                       ! CTRL SPACE
  11263.     disass
  11264.   CASE 96                       ! CTRL >
  11265.     IF out%=0
  11266.       out("Logbuch")
  11267.     ENDIF
  11268.     out("LGS:"+STR$(lgs%))
  11269.     do_list
  11270.     log_out
  11271.     next(0)
  11272.   CASE 98                       ! CTRL HELP
  11273.     opt_help
  11274.   CASE 115                      ! CTRL Cursor left
  11275.     prev(wind%)
  11276.   CASE 116                      ! CTRL Cursor right
  11277.     next(wind%)
  11278.   DEFAULT
  11279.     edit_buf(hi%,low%)          ! sonst Edit Buffer
  11280.   ENDSELECT
  11281. RETURN
  11282. PROCEDURE cursor(hi%,low%)
  11283.   .| Glob. Var.: wind%,xt%,hex!,beg_ascii%
  11284.   .| Felder    : whdl&()
  11285.   .| Ruft auf  : coff,floskel,c_down,c_up,c_left,c_right,top,opt_help,do_undo
  11286.   .|     cursor,set_slide,set_tz,do_cursor_anz,blit_cursor
  11287.   .| Aufruf in : taste-1,cursor-1,ctrl_tab-1,tab-1,maus_pos-1,edit_ex-1,
  11288.   coff
  11289.   IF hi%>58 AND hi%<69
  11290.     floskel(hi%)
  11291.   ELSE
  11292.     SELECT hi%
  11293.       '
  11294.     CASE 80                     ! DOWN
  11295.       c_down
  11296.     CASE 72                     ! UP
  11297.       c_up
  11298.     CASE 75                     ! LEFT
  11299.       c_left
  11300.     CASE 77                     ! RIGHT
  11301.       c_right
  11302.       '
  11303.     CASE 71                     ! HOME
  11304.       top(wind%)
  11305.     CASE 98                     ! HELP
  11306.       opt_help
  11307.     CASE 97                     ! UNDO
  11308.       do_undo
  11309.     ENDSELECT
  11310.     '
  11311.   ENDIF
  11312.   '
  11313.   IF wind%=0
  11314.     IF xt%>=0 AND xt%<47        ! HEX-BEREICH
  11315.       IF FRAC((xt%+1)/3)=0
  11316.         IF hi%=75               ! wenn LEFT und hi_nibble, dann 2 LEFT
  11317.           DEC xt%
  11318.         ELSE
  11319.           INC xt%
  11320.         ENDIF
  11321.       ENDIF
  11322.       hex!=TRUE
  11323.     ELSE
  11324.       IF xt%>49 AND xt%<beg_ascii%+15   ! ASCII - BEREICH
  11325.         hex!=FALSE
  11326.       ENDIF
  11327.     ENDIF
  11328.     IF FRAC((xt%+1)/3)=0 AND hex!=TRUE
  11329.       cursor(77,0)
  11330.     ENDIF
  11331.   ENDIF
  11332.   set_slide(whdl&(wind%))
  11333.   set_tz
  11334.   do_cursor_anz(wind%)
  11335.   blit_cursor
  11336. RETURN
  11337. PROCEDURE alt(hi%,low%)
  11338.   .| Ruft auf  : test_suche,magic,edit_buf
  11339.   .| Aufruf in : taste-1,
  11340.   SELECT hi%
  11341.   CASE 120              ! ALT-1
  11342.     test_suche
  11343.     '
  11344.   CASE 50
  11345.     magic               ! ALT-M
  11346.   DEFAULT
  11347.     edit_buf(hi%,low%)  ! Edit
  11348.   ENDSELECT
  11349. RETURN
  11350. '
  11351. PROCEDURE alt_f               ! Block füllen mit Byte unter Cursor
  11352.   .| Glob. Var.: wind%,bc%,buf_end%,buf_beg%,buf%,tz%,z%,ch%
  11353.   .| Ruft auf  : do_list,nur_daten_fenster
  11354.   .| Aufruf in : menu_mess-1,
  11355.   LOCAL ab%,bb$
  11356.   IF wind%=0
  11357.     bc%=buf_end%-buf_beg%
  11358.     IF bc%>0
  11359.       INC bc%
  11360.       ab%=BYTE{buf%+tz%+z%}
  11361.       bb$=STRING$(bc%,ab%)
  11362.       BMOVE V:bb$,buf_beg%+buf%,bc%
  11363.       INC ch%
  11364.       CLR bb$
  11365.       do_list
  11366.     ENDIF
  11367.   ELSE
  11368.     nur_daten_fenster
  11369.   ENDIF
  11370. RETURN
  11371. PROCEDURE alt_q               ! Komplett suchen
  11372.   .| Glob. Var.: erg%,no_nxt%,found!,abb%,search$,in1$,search_cont%,mode%
  11373.   .|     d.isk%,lgs%,tz%,z%,f.ile%,fi_o$,fp%,h.ard%,block%,r.am%,ram_addr%
  11374.   .| Felder    : whdl&()
  11375.   .| Ruft auf  : clr_out,search,info_line,set_slide,out,dec_hex_val$,lesen
  11376.   .|     out_do
  11377.   .| Aufruf in : menu_mess-1,
  11378.   LOCAL first!
  11379.   first!=TRUE
  11380.   erg%=3
  11381.   clr_out("")
  11382.   DO
  11383.     search
  11384.     EXIT IF (no_nxt%=1 AND found!=FALSE) OR abb% OR search$=""
  11385.     info_line
  11386.     set_slide(whdl&(0))
  11387.     IF first!=TRUE
  11388.       out("Komplett suchen: "+in1$)
  11389.       first!=FALSE
  11390.     ENDIF
  11391.     search_cont%=1
  11392.     '
  11393.     SELECT mode%
  11394.     CASE d.isk%
  11395.       out("in Sektor "+@dec_hex_val$(lgs%,8)+" Adresse "+@dec_hex_val$(tz%+z%,4))
  11396.     CASE f.ile%
  11397.       out("in Datei "+fi_o$+" Adresse "+@dec_hex_val$(fp%+tz%+z%,8))
  11398.     CASE h.ard%
  11399.       out("in Block "+@dec_hex_val$(block%,8)+" Adresse "+@dec_hex_val$(tz%+z%,4))
  11400.     CASE r.am%
  11401.       out("an Adresse "+@dec_hex_val$(ram_addr%+tz%,8))
  11402.     ENDSELECT
  11403.   LOOP
  11404.   CLR search_cont%
  11405.   lesen
  11406.   out_do
  11407. RETURN
  11408. PROCEDURE alt_t               ! Block ins ASCII-Fenster
  11409.   .| Glob. Var.: wind%,erg%,out%,bc%,buf_end%,buf_beg%,buf%,a$
  11410.   .| Felder    : out$()
  11411.   .| Ruft auf  : out,check_tab$,out_do,lend,nur_daten_fenster
  11412.   .| Aufruf in : menu_mess-1,
  11413.   LOCAL ab%,a%,b%,c%,b$
  11414.   '
  11415.   IF wind%=0
  11416.     erg%=3
  11417.     IF out%=0
  11418.       out$(0)="Block -> Text"
  11419.       INC out%
  11420.     ENDIF
  11421.     bc%=buf_end%-buf_beg%
  11422.     IF bc%>0
  11423.       b%=buf_beg%+buf%
  11424.       c%=b%+bc%+1
  11425.       b$=STRING$(MIN(255,bc%),0)
  11426.       '
  11427.       WHILE b%<=c%       ! schon am Ende?
  11428.         BMOVE b%,V:b$,LEN(b$)
  11429.         a%=INSTR(1,b$,CHR$(10))
  11430.         IF a%<2
  11431.           a%=LEN(b$)+2
  11432.         ENDIF
  11433.         a$=STRING$(a%-2,0)
  11434.         BMOVE b%,V:a$,LEN(a$)
  11435.         out(@check_tab$(a$))
  11436.         IF a%=LEN(b$)+2
  11437.           SUB a%,2
  11438.         ENDIF
  11439.         ADD b%,a%
  11440.       WEND
  11441.       out_do
  11442.       lend(1)
  11443.     ENDIF
  11444.   ELSE
  11445.     nur_daten_fenster
  11446.   ENDIF
  11447. RETURN
  11448. '
  11449. PROCEDURE ctrl_a              ! Alles auswählen
  11450.   .| Glob. Var.: wind%,buf_beg%,buf_end%,l_end%,tbuf_beg%,tbuf_end%,out%
  11451.   .| Ruft auf  : set_stat,do_list
  11452.   .| Aufruf in : menu_mess-1,
  11453.   IF wind%=0
  11454.     buf_beg%=0
  11455.     buf_end%=l_end%
  11456.   ELSE
  11457.     tbuf_beg%=0
  11458.     tbuf_end%=out%*255
  11459.   ENDIF
  11460.   set_stat
  11461.   do_list
  11462. RETURN
  11463. PROCEDURE ctrl_b              ! Blockanfang
  11464.   .| Glob. Var.: wind%,buf_beg%,tz%,z%,tbuf_beg%,top%,txt_zeile%,txt_spalte%
  11465.   .| Ruft auf  : set_stat,do_list
  11466.   .| Aufruf in : menu_mess-1,
  11467.   IF wind%=0
  11468.     buf_beg%=tz%+z%
  11469.   ELSE
  11470.     tbuf_beg%=(top%+txt_zeile%)*255+txt_spalte%
  11471.   ENDIF
  11472.   set_stat
  11473.   do_list
  11474. RETURN
  11475. PROCEDURE ctrl_c              ! Block Copy
  11476.   .| Glob. Var.: wind%,buf_end%,buf_beg%,buf%,tz%,z%,ch%
  11477.   .| Ruft auf  : do_list,nur_daten_fenster
  11478.   .| Aufruf in : menu_mess-1,
  11479.   LOCAL bb$,bc%
  11480.   '
  11481.   IF wind%=0
  11482.     bc%=buf_end%-buf_beg%+1
  11483.     IF bc%>1
  11484.       bb$=STRING$(bc%,0)
  11485.       BMOVE buf_beg%+buf%,V:bb$,bc%
  11486.       BMOVE V:bb$,buf%+tz%+z%,bc%
  11487.       INC ch%
  11488.       CLR bb$
  11489.       do_list
  11490.     ENDIF
  11491.   ELSE
  11492.     nur_daten_fenster
  11493.   ENDIF
  11494. RETURN
  11495. PROCEDURE ctrl_f              ! Suchen
  11496.   .| Felder    : whdl&()
  11497.   .| Ruft auf  : change,search,set_slide,do_list
  11498.   .| Aufruf in : menu_mess-1,
  11499.   change
  11500.   search
  11501.   set_slide(whdl&(0))
  11502.   do_list
  11503. RETURN
  11504. PROCEDURE ctrl_g              ! Weitersuchen
  11505.   .| Glob. Var.: search_cont%
  11506.   .| Ruft auf  : change,search,do_list
  11507.   .| Aufruf in : menu_mess-1,
  11508.   change
  11509.   search_cont%=1
  11510.   search
  11511.   do_list
  11512.   CLR search_cont%
  11513. RETURN
  11514. PROCEDURE ctrl_h              ! Blockmarkierung löschen
  11515.   .| Glob. Var.: wind%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg%,txt_blkon%
  11516.   .| Felder    : whdl&()
  11517.   .| Ruft auf  : set_stat,wind_top,menu_blkhide,redraw,set_var_txt
  11518.   .| Aufruf in : set_block-1,menu_mess-1,edit_ascii-1,search-2,opt_ascii-1,
  11519.   IF wind%=0
  11520.     buf_end%=buf_beg%-1
  11521.     set_stat
  11522.     wind_top(whdl&(0))
  11523.     menu_blkhide(0)
  11524.     redraw(0)
  11525.   ELSE
  11526.     IF tbuf_end%>tbuf_beg%
  11527.       CLR tbuf_beg%,tbuf_end%,txt_blkon%
  11528.       set_var_txt
  11529.       set_stat
  11530.       redraw(1)
  11531.     ENDIF
  11532.   ENDIF
  11533. RETURN
  11534. PROCEDURE ctrl_k              ! Blockende
  11535.   .| Glob. Var.: wind%,buf_end%,tz%,z%,tbuf_end%,top%,txt_zeile%,txt_spalte%
  11536.   .| Ruft auf  : set_stat,do_list
  11537.   .| Aufruf in : menu_mess-1,
  11538.   IF wind%=0
  11539.     buf_end%=tz%+z%
  11540.   ELSE
  11541.     tbuf_end%=(top%+txt_zeile%)*255+txt_spalte%
  11542.   ENDIF
  11543.   set_stat
  11544.   do_list
  11545. RETURN
  11546. PROCEDURE ctrl_t              ! Block->Funktionstaste
  11547.   .| Glob. Var.: wind%,buf_end%,buf_beg%,i%,j%,f1o&,f.key%,b.ox%,boxtxt&,a$
  11548.   .|     boxaktiv&
  11549.   .| Felder    : flos$()
  11550.   .| Ruft auf  : set_state,clr_state,box_draw,form_do,objc_update,box_undraw
  11551.   .|     put_char,put_to_fkey,nur_daten_fenster
  11552.   .| Aufruf in : menu_mess-1,
  11553.   LOCAL a%,b%,c%,fu%,ex_obj&,ex_objc%
  11554.   IF wind%=0
  11555.     IF buf_end%>buf_beg%
  11556.       FOR i%=1 TO 10
  11557.         j%=f1o&+i%-1
  11558.         IF VAL(flos$(0,i%))<>0
  11559.           set_state(f.key%,j%,4)  ! HAKEN
  11560.         ELSE
  11561.           clr_state(f.key%,j%,4)
  11562.         ENDIF
  11563.       NEXT i%
  11564.       '
  11565.       DO
  11566.         box_draw(f.key%)          ! FKEY-Dialog
  11567.         ex_obj&=@form_do(f.key%)
  11568.         ex_objc%=ex_obj& AND &HFF
  11569.         clr_state(f.key%,ex_objc%,1)
  11570.         objc_update(f.key%,ex_objc%)
  11571.         box_undraw(f.key%)
  11572.         '
  11573.         c%=ex_objc%-f1o&+1
  11574.         EXIT IF (ex_obj& AND &HFF00)=0    ! Raus wenn kein Doppelklick
  11575.         '
  11576.         put_char(b.ox%,boxtxt&,"FKEY "+STR$(c%)+"-Belegung")
  11577.         a$=STR$(LEN(flos$(1,c%))/2)+"  "+LEFT$(flos$(1,c%),20)
  11578.         put_char(b.ox%,boxaktiv&,a$)
  11579.         box_draw(b.ox%)
  11580.         ex_obj&=@form_do(b.ox%) AND &HFF
  11581.         clr_state(f.key%,ex_obj&,1)
  11582.         box_undraw(b.ox%)
  11583.       LOOP
  11584.       IF c%>=1 AND c%<=10
  11585.         put_to_fkey(c%)           ! Funktiostaste belegen
  11586.       ENDIF
  11587.     ENDIF
  11588.   ELSE
  11589.     nur_daten_fenster
  11590.   ENDIF
  11591. RETURN
  11592. '
  11593. PROCEDURE put_to_fkey(fkey%)
  11594.   .| Glob. Var.: buf_end%,buf_beg%,buf%
  11595.   .| Felder    : flos$()
  11596.   .| Ruft auf  : mtasse,mnorm
  11597.   .| Aufruf in : ctrl_t-1,last_9-1,
  11598.   LOCAL j%,i%,bc%,fu%
  11599.   '
  11600.   mtasse
  11601.   bc%=buf_end%-buf_beg%+1
  11602.   flos$(0,fkey%)=STR$(bc%*2)
  11603.   flos$(1,fkey%)=STRING$(bc%*2,0)
  11604.   j%=1
  11605.   FOR i%=1 TO bc%
  11606.     fu%=BYTE{buf%+buf_beg%+i%-1}
  11607.     MID$(flos$(1,fkey%),j%)=HEX$(fu%,2)
  11608.     ADD j%,2
  11609.   NEXT i%
  11610.   mnorm
  11611. RETURN
  11612. FUNCTION last_char(a$)
  11613.   .| Aufruf in : taste-1,edit_ascii-1,
  11614.   LOCAL a%
  11615.   '
  11616.   a%=LEN(a$)
  11617.   WHILE MID$(a$,a%,1)=" " AND a%>1
  11618.     DEC a%
  11619.   WEND
  11620.   RETURN a%+1
  11621. ENDFUNC
  11622. '
  11623. PROCEDURE ctrl_tab            ! Tabulator zurück
  11624.   .| Glob. Var.: i%,tabs%
  11625.   .| Ruft auf  : cursor
  11626.   .| Aufruf in : control-1,
  11627.   FOR i%=1 TO tabs%
  11628.     cursor(75,0)
  11629.   NEXT i%
  11630. RETURN
  11631. PROCEDURE set_stat            ! Revers ...
  11632.   .| Glob. Var.: wind%,utis%,ak%,l_end%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg%
  11633.   .|     txt_blkon%
  11634.   .| Ruft auf  : menu_blkhide,set_var_txt
  11635.   .| Aufruf in : set_block-1,txt_block-1,wind_top-1,set_w-1,do_in-1,ctrl_a-1
  11636.   .|     ctrl_b-1,ctrl_h-2,ctrl_k-1,set_found_block-1,
  11637.   IF wind%=0
  11638.     ~C:utis%(&H300,L:ak%,L:l_end%-1)    ! erst löschen ...
  11639.     IF buf_end%>=buf_beg%
  11640.       ~C:utis%(&H301,L:ak%+buf_beg%,L:buf_end%-buf_beg%)
  11641.       menu_blkhide(1)
  11642.     ELSE
  11643.       menu_blkhide(0)
  11644.     ENDIF
  11645.   ELSE
  11646.     set_var_txt
  11647.     IF tbuf_end%>tbuf_beg%
  11648.       txt_blkon%=1
  11649.       menu_blkhide(1)
  11650.     ELSE
  11651.       txt_blkon%=0
  11652.       menu_blkhide(0)
  11653.     ENDIF
  11654.   ENDIF
  11655. RETURN
  11656. PROCEDURE tab                 ! Tabulator vor
  11657.   .| Glob. Var.: tabs%
  11658.   .| Ruft auf  : cursor
  11659.   .| Aufruf in : taste-2,
  11660.   LOCAL i%
  11661.   FOR i%=1 TO tabs%
  11662.     cursor(77,0)
  11663.   NEXT i%
  11664. RETURN
  11665. PROCEDURE magic               ! $1234
  11666.   .| Glob. Var.: buf%,z%,wzb%,ch%
  11667.   .| Ruft auf  : do_list
  11668.   .| Aufruf in : alt-1,
  11669.   ~XBIOS(18,L:buf%,L:-1,-1,1)
  11670.   z%=512-wzb%
  11671.   INC ch%
  11672.   do_list
  11673. RETURN
  11674. PROCEDURE next(nr%)           ! Next
  11675.   .| Glob. Var.: z%,l_end%,wzb%
  11676.   .| Ruft auf  : down
  11677.   .| Aufruf in : wind_slide-1,control-2,scrollup-2,
  11678.   z%=l_end%-wzb%
  11679.   @down(nr%)
  11680. RETURN
  11681. PROCEDURE prev(nr%)           ! Previous
  11682.   .| Glob. Var.: z%
  11683.   .| Ruft auf  : up
  11684.   .| Aufruf in : wind_slide-1,control-1,scrolldown-1,
  11685.   CLR z%
  11686.   up(nr%)
  11687. RETURN
  11688. PROCEDURE set_list_offset
  11689.   .| Glob. Var.: wind%,a%,offset%,el%
  11690.   .| Ruft auf  : eingabe,do_list,nur_daten_fenster
  11691.   .| Aufruf in : menu_mess-1,
  11692.   IF wind%=0
  11693.     a%=@eingabe("Anzeige-Offset eingeben:",offset%)
  11694.     IF el%>0
  11695.       offset%=a%
  11696.       do_list
  11697.     ENDIF
  11698.   ELSE
  11699.     nur_daten_fenster
  11700.   ENDIF
  11701. RETURN
  11702. ' ----------------------
  11703. PROCEDURE c_down        ! Cursor down
  11704.   .| Glob. Var.: wind%,yt%,wz%,txt_zeile%
  11705.   .| Ruft auf  : scrollup
  11706.   .| Aufruf in : cursor-1,
  11707.   IF wind%=0
  11708.     IF yt%<wz%-1
  11709.       INC yt%
  11710.     ELSE
  11711.       scrollup(wind%)
  11712.     ENDIF
  11713.   ELSE
  11714.     IF txt_zeile%+1<wz%
  11715.       INC txt_zeile%
  11716.     ELSE
  11717.       scrollup(wind%)
  11718.     ENDIF
  11719.   ENDIF
  11720. RETURN
  11721. PROCEDURE c_up          ! Cursor up
  11722.   .| Glob. Var.: wind%,yt%,txt_zeile%
  11723.   .| Ruft auf  : scrolldown
  11724.   .| Aufruf in : cursor-1,
  11725.   IF wind%=0
  11726.     IF yt%>0
  11727.       DEC yt%
  11728.     ELSE
  11729.       scrolldown(wind%)
  11730.     ENDIF
  11731.   ELSE
  11732.     IF txt_zeile%>0
  11733.       DEC txt_zeile%
  11734.     ELSE
  11735.       scrolldown(wind%)
  11736.     ENDIF
  11737.   ENDIF
  11738. RETURN
  11739. PROCEDURE c_left        ! Cursor left
  11740.   .| Glob. Var.: wind%,xt%,hex!,yt%,beg_ascii%,wz%,txt_spalte%
  11741.   .| Ruft auf  : up,scroll_right
  11742.   .| Aufruf in : cursor-1,
  11743.   IF wind%=0
  11744.     DEC xt%
  11745.     IF hex!=TRUE
  11746.       IF xt%<0
  11747.         xt%=46
  11748.         DEC yt%
  11749.       ENDIF
  11750.     ELSE
  11751.       IF xt%<beg_ascii%
  11752.         xt%=beg_ascii%+15
  11753.         DEC yt%
  11754.       ENDIF
  11755.     ENDIF
  11756.     IF yt%<0
  11757.       up(wind%)
  11758.       yt%=wz%-1
  11759.       IF hex!=TRUE
  11760.         IF xt%<0
  11761.           xt%=46
  11762.           DEC yt%
  11763.         ENDIF
  11764.       ELSE
  11765.         IF xt%<beg_ascii%
  11766.           xt%=beg_ascii%+15
  11767.           DEC yt%
  11768.         ENDIF
  11769.       ENDIF
  11770.     ENDIF
  11771.   ELSE
  11772.     IF txt_spalte%>1
  11773.       txt_spalte%=MAX(1,txt_spalte%-1)
  11774.     ELSE
  11775.       scroll_right
  11776.     ENDIF
  11777.   ENDIF
  11778. RETURN
  11779. PROCEDURE c_right       ! Curosr right
  11780.   .| Glob. Var.: wind%,xt%,hex!,yt%,beg_ascii%,wz%,txt_spalte%,wc%
  11781.   .| Ruft auf  : scrollup,scroll_left
  11782.   .| Aufruf in : cursor-1,
  11783.   IF wind%=0
  11784.     INC xt%
  11785.     IF hex!=TRUE
  11786.       IF xt%>46
  11787.         CLR xt%
  11788.         INC yt%
  11789.       ENDIF
  11790.     ELSE
  11791.       IF xt%>beg_ascii%+15
  11792.         xt%=beg_ascii%
  11793.         INC yt%
  11794.       ENDIF
  11795.     ENDIF
  11796.     IF yt%>wz%-1
  11797.       scrollup(wind%)
  11798.     ENDIF
  11799.   ELSE
  11800.     IF txt_spalte%<wc%
  11801.       txt_spalte%=MIN(wc%,txt_spalte%+1)
  11802.     ELSE
  11803.       scroll_left
  11804.     ENDIF
  11805.   ENDIF
  11806. RETURN
  11807. ' ----------------------
  11808. PROCEDURE pos_cursor(x%)      ! Cursor auf bestimmte Position setzen
  11809.   .| Glob. Var.: z%,wzb%,yt%,wz%,xt%,beg_ascii%,hex!
  11810.   .| Ruft auf  : set_tz
  11811.   .| Aufruf in : to_blk_anf-1,to_blk_end-1,address-2,search_found-1,
  11812.   z%=INT(x%/wzb%)*wzb%
  11813.   SUB x%,z%
  11814.   yt%=x%/16
  11815.   WHILE yt%>=wz%
  11816.     ADD z%,16
  11817.     DEC yt%
  11818.   WEND
  11819.   xt%=x%-yt%*16+beg_ascii%
  11820.   IF hex!=TRUE
  11821.     xt%=(x%-yt%*16)*3
  11822.   ENDIF
  11823.   set_tz
  11824. RETURN
  11825. PROCEDURE set_tz
  11826.   .| Glob. Var.: hex!,tz%,xt%,yt%,beg_ascii%
  11827.   .| Aufruf in : dir_secsearch-1,cursor-1,pos_cursor-1,maus_pos-1,lend-1,up-1
  11828.   .|     up_1-1,address-1,set_cursor_in_fat-1,
  11829.   IF hex!=TRUE
  11830.     tz%=xt%/3+yt%*16
  11831.   ELSE
  11832.     tz%=xt%-beg_ascii%+yt%*16
  11833.   ENDIF
  11834. RETURN
  11835. PROCEDURE dec_hex             ! Dezimal-Hex Umschalten
  11836.   .| Glob. Var.: dec%,wind%
  11837.   .| Ruft auf  : do_cursor_anz,info_line,maus_off
  11838.   .| Aufruf in : stat_line-1,
  11839.   dec%=1-dec%
  11840.   do_cursor_anz(wind%)
  11841.   info_line
  11842.   maus_off
  11843. RETURN
  11844. PROCEDURE maus_pos(mx%,my%)
  11845.   .| Glob. Var.: wind%,xt%,tx%,z.breite%,beg_ascii%,yt%,z.hoehe%,wz%,hex!
  11846.   .|     txt_spalte%,txt_zeile%,last%
  11847.   .| Felder    : ty%(),wi%(),tx%()
  11848.   .| Ruft auf  : cursor,set_tz,dum,last_3,last_4,last_5,last_7,last_8,last_9
  11849.   .|     last_10,last_11,last_12
  11850.   .| Aufruf in : set_block-2,txt_block-2,message_auswerten-2,wind_dklick-1,
  11851.   IF wind%=0
  11852.     xt%=(mx%-tx%-9*z.breite%)/z.breite%
  11853.     IF xt%>beg_ascii%+15
  11854.       xt%=beg_ascii%+15
  11855.     ENDIF
  11856.     yt%=(my%-ty%(wind%)+z.hoehe%-1)/z.hoehe%
  11857.     '
  11858.     IF xt%>46 AND xt%<beg_ascii%
  11859.       xt%=46
  11860.     ENDIF
  11861.     yt%=MIN(wz%-1,MAX(0,yt%))
  11862.     xt%=MIN(beg_ascii%+16,MAX(0,xt%))
  11863.     IF xt%>=0 AND xt%<47
  11864.       hex!=TRUE
  11865.       IF FRAC((xt%+1)/3)=0
  11866.         xt%=MAX(0,xt%-1)
  11867.       ENDIF
  11868.     ELSE
  11869.       hex!=FALSE
  11870.     ENDIF
  11871.     IF FRAC((xt%+1)/3)=0 AND hex!=TRUE
  11872.       cursor(77,0)
  11873.     ENDIF
  11874.     set_tz
  11875.   ELSE
  11876.     IF mx%>wi%(1,1) AND mx%<wi%(1,1)+wi%(1,3) AND my%>wi%(1,2) AND my%<wi%(1,2)+wi%(1,4)
  11877.       txt_spalte%=MAX(1,(mx%-tx%(1))/z.breite%+1)
  11878.       txt_zeile%=MIN(wz%-1,((my%+z.hoehe%-ty%(1)) DIV z.hoehe%))
  11879.       IF last%>0
  11880.         ON last% GOSUB dum,dum,last_3,last_4,last_5,dum,last_7,last_8,last_9,last_10,last_11,last_12
  11881.       ENDIF
  11882.     ENDIF
  11883.   ENDIF
  11884. RETURN
  11885. PROCEDURE maus_off
  11886.   .| Ruft auf  : mousek
  11887.   .| Aufruf in : dum-1,dec_hex-1,exit-1,
  11888.   WHILE @mousek
  11889.   WEND
  11890. RETURN
  11891. ' ----------------------
  11892. PROCEDURE edit_buf(hi%,low%)
  11893.   .| Glob. Var.: wind%,ch%,hex!,dt%,buf%,tz%,z%,dtl%,dth%,xt%
  11894.   .| Ruft auf  : edit_ex,edit_ascii
  11895.   .| Aufruf in : taste-2,control-1,alt-1,
  11896.   LOCAL a%,b%
  11897.   '
  11898.   a%=low%
  11899.   IF wind%=0
  11900.     INC ch%
  11901.     IF hex!=FALSE                         ! Edit in ASCII-Teil
  11902.       dt%=a%
  11903.       edit_ex
  11904.     ELSE
  11905.       IF (a%>96 AND a%<103) OR (a%>64 AND a%<71) OR (a%>47 AND a%<58)
  11906.         IF a%>&H60
  11907.           SUB a%,32
  11908.         ENDIF
  11909.         a%=a%-48+7*(a%>&H40)
  11910.         b%=buf%+tz%+z%                    ! Alter Wert
  11911.         dtl%=BYTE{b%} AND 15              ! in Lownibble und
  11912.         dth%=BYTE{b%} AND 240             !    Hinibble zerlegen
  11913.         IF FRAC((xt%+3)/3)=0
  11914.           dt%=dtl%+a%*16                  ! Cursor ist auf Hi-Nibble
  11915.         ELSE
  11916.           dt%=dth%+a%                     !        ist auf Low - "
  11917.         ENDIF
  11918.         edit_ex
  11919.       ENDIF
  11920.     ENDIF
  11921.   ELSE
  11922.     edit_ascii(a%)
  11923.   ENDIF
  11924. RETURN
  11925. PROCEDURE edit_ascii(taste%)
  11926.   .| Glob. Var.: sperr_txt%,last%,ch2%,top%,txt_zeile%,l_eline%,undo_line$
  11927.   .|     out%,txt_spalte%,txt_links%,wc%,l_end%,wz%
  11928.   .| Felder    : out$(),whdl&()
  11929.   .| Ruft auf  : ctrl_h,out,last_char,do_list,new_line,set_slide,scroll_left
  11930.   .|     text_line,do_cursor_anz,blit_cursor
  11931.   .| Aufruf in : edit_buf-1,
  11932.   LOCAL a%,ls%,i%,x%,y%,a$,b$
  11933.   '
  11934.   IF sperr_txt%=0 AND last%=0
  11935.     INC ch2%                      ! Textfenster was geändert
  11936.     ctrl_h
  11937.     CLR last%
  11938.     '
  11939.     x%=top%+txt_zeile%            ! Zeile
  11940.     IF l_eline%<>x%
  11941.       undo_line$=out$(x%)
  11942.       l_eline%=x%
  11943.     ENDIF
  11944.     IF x%>out%
  11945.       FOR i%=out% TO x%+1
  11946.         out("")
  11947.       NEXT i%
  11948.     ENDIF
  11949.     '
  11950.     y%=txt_spalte%+txt_links%     ! Spalte
  11951.     a$=out$(x%)                   ! akt. String
  11952.     '
  11953.     IF LEN(a$)<y%
  11954.       a$=LEFT$(a$+STRING$(wc%,32),wc%)
  11955.     ENDIF
  11956.     '
  11957.     SELECT taste%
  11958.       '
  11959.     CASE 8                        ! BACKSPACE
  11960.       '
  11961.       IF x%>0
  11962.         IF y%>1
  11963.           IF out$(x%)=" "
  11964.             txt_spalte%=1
  11965.           ELSE
  11966.             a$=LEFT$(a$,y%-2)+RIGHT$(a$,LEN(a$)-y%+1)
  11967.             txt_spalte%=MAX(y%-1,1)
  11968.             out$(x%)=a$
  11969.           ENDIF
  11970.         ELSE
  11971.           IF x%>1
  11972.             DELETE out$(x%)
  11973.             DEC x%
  11974.             b$=out$(x%)
  11975.             ls%=@last_char(b$)
  11976.             out$(x%)=LEFT$(b$,ls%)+a$
  11977.             do_list
  11978.             txt_spalte%=ls%
  11979.             txt_zeile%=MAX(0,txt_zeile%-1)
  11980.           ENDIF
  11981.         ENDIF
  11982.       ENDIF
  11983.       '
  11984.     CASE 13                       ! RETURN
  11985.       INSERT out$(x%+1)=RIGHT$(a$,LEN(a$)-y%+1)
  11986.       out$(x%)=LEFT$(a$,y%-1)
  11987.       IF x%<out%
  11988.         INC out%
  11989.         INC l_end%
  11990.       ELSE
  11991.         out%=x%
  11992.         l_end%=x%
  11993.       ENDIF
  11994.       IF top%+wz%+1>out%-1
  11995.         top%=out%-wz%
  11996.       ENDIF
  11997.       new_line
  11998.       set_slide(whdl&(1))
  11999.       do_list
  12000.       txt_spalte%=1
  12001.       '
  12002.     CASE 31                       ! CTRL-DEL
  12003.       undo_line$=CHR$(3)+out$(x%)
  12004.       DELETE out$(x%)
  12005.       DEC out%
  12006.       DEC l_end%
  12007.       IF top%+wz%>out%
  12008.         top%=out%-wz%
  12009.       ENDIF
  12010.       set_slide(whdl&(1))
  12011.       do_list
  12012.       '
  12013.     CASE 127                      ! DEL
  12014.       a$=LEFT$(a$,y%-1)+RIGHT$(a$,LEN(a$)-y%)
  12015.       out$(x%)=a$
  12016.       '
  12017.     DEFAULT                       ! EDIT normal einfügen
  12018.       a$=LEFT$(a$,y%-1)+CHR$(taste%)+RIGHT$(a$,MAX(1,LEN(a$)-y%+1))
  12019.       out$(x%)=a$
  12020.       IF txt_spalte%>=wc%
  12021.         scroll_left
  12022.       ELSE
  12023.         INC txt_spalte%
  12024.       ENDIF
  12025.     ENDSELECT
  12026.     '
  12027.     IF wz%>1
  12028.       text_line(x%+1)
  12029.     ENDIF
  12030.     IF txt_spalte%>wc%
  12031.       new_line
  12032.     ENDIF
  12033.     do_cursor_anz(1)
  12034.     blit_cursor
  12035.   ELSE
  12036.     IF last%
  12037.       CLR last%
  12038.       do_cursor_anz(1)
  12039.     ENDIF
  12040.   ENDIF
  12041. RETURN
  12042. PROCEDURE edit_ex
  12043.   .| Glob. Var.: buf%,tz%,z%,dt%,hex!,yt%,xt%,beg_ascii%
  12044.   .| Ruft auf  : coff,byte,cursor
  12045.   .| Aufruf in : edit_buf-2,
  12046.   BYTE{buf%+tz%+z%}=dt%          ! in Puffer schreiben
  12047.   coff
  12048.   IF hex!=TRUE
  12049.     byte(yt%,xt%/3)
  12050.   ELSE
  12051.     byte(yt%,xt%-beg_ascii%)
  12052.   ENDIF
  12053.   cursor(77,0)
  12054. RETURN
  12055. PROCEDURE new_line
  12056.   .| Glob. Var.: txt_zeile%,wz%,txt_spalte%
  12057.   .| Ruft auf  : scrollup
  12058.   .| Aufruf in : edit_ascii-2,
  12059.   IF txt_zeile%<wz%-1
  12060.     txt_spalte%=1
  12061.     INC txt_zeile%
  12062.   ELSE
  12063.     scrollup(1)
  12064.   ENDIF
  12065. RETURN
  12066. ' ----------------- Proceduren für Bildschirm ------------------
  12067. PROCEDURE scrollup(nr%)       ! eine Zeile nach oben
  12068.   .| Glob. Var.: top%,out%,wz%,wind_top%,wind%,z%,l_end%,wzb%,mode%,f.ile%,fp%
  12069.   .|     fl%,yt%
  12070.   .| Felder    : whdl&()
  12071.   .| Ruft auf  : wind_aktpar,coff,get_up,text_line,redraw,zeile,next,set_slide
  12072.   .| Aufruf in : set_block-1,txt_block-1,wind_slide-2,c_down-2,c_right-1
  12073.   .|     new_line-1,
  12074.   wind_aktpar(nr%)
  12075.   IF nr%=1
  12076.     IF top%<out%-wz%
  12077.       INC top%
  12078.       coff
  12079.       IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind%
  12080.         get_up
  12081.         text_line(top%+wz%)
  12082.       ELSE
  12083.         redraw(nr%)
  12084.       ENDIF
  12085.     ENDIF
  12086.   ELSE
  12087.     IF z%<l_end%-wzb%
  12088.       ADD z%,16
  12089.       coff
  12090.       IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind%
  12091.         get_up
  12092.         zeile(wz%-1)
  12093.       ELSE
  12094.         redraw(nr%)
  12095.       ENDIF
  12096.     ELSE
  12097.       IF mode%=f.ile%
  12098.         IF fp%+wzb%+z%<=fl%
  12099.           next(nr%)
  12100.           CLR yt%
  12101.         ENDIF
  12102.       ELSE
  12103.         next(nr%)
  12104.         CLR yt%
  12105.       ENDIF
  12106.     ENDIF
  12107.   ENDIF
  12108.   set_slide(nr%)
  12109. RETURN
  12110. PROCEDURE scrolldown(nr%)
  12111.   .| Glob. Var.: top%,wind_top%,wind%,z%
  12112.   .| Felder    : whdl&()
  12113.   .| Ruft auf  : wind_aktpar,coff,get_down,text_line,redraw,zeile,prev
  12114.   .|     set_slide
  12115.   .| Aufruf in : set_block-1,txt_block-1,wind_slide-2,c_up-2,
  12116.   wind_aktpar(nr%)
  12117.   IF nr%=1
  12118.     IF top%>1
  12119.       coff
  12120.       DEC top%
  12121.       IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind%
  12122.         get_down
  12123.         text_line(top%+1)
  12124.       ELSE
  12125.         redraw(nr%)
  12126.       ENDIF
  12127.     ENDIF
  12128.   ELSE
  12129.     IF z%>=16
  12130.       SUB z%,16
  12131.       coff
  12132.       IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind%
  12133.         get_down
  12134.         zeile(0)
  12135.       ELSE
  12136.         redraw(nr%)
  12137.       ENDIF
  12138.     ELSE
  12139.       prev(nr%)
  12140.     ENDIF
  12141.   ENDIF
  12142.   set_slide(nr%)
  12143. RETURN
  12144. PROCEDURE get_up              ! Windowinhalt eine Zeile nach oben
  12145.   .| Glob. Var.: nr%,wz%,z.hoehe%
  12146.   .| Felder    : par%(),tx%(),ty%(),wi%(),scr%()
  12147.   .| Aufruf in : scrollup-2,
  12148.   par%(0)=tx%(nr%)
  12149.   par%(1)=ty%(nr%)+1
  12150.   par%(2)=wi%(nr%,3)+wi%(nr%,1)
  12151.   par%(3)=ty%(nr%)+(wz%-1)*z.hoehe%
  12152.   '
  12153.   par%(4)=par%(0)
  12154.   par%(5)=par%(1)-z.hoehe%
  12155.   par%(6)=par%(2)
  12156.   par%(7)=par%(3)-z.hoehe%
  12157.   par%(8)=3
  12158.   '
  12159.   CLIP OFF
  12160.   ~WIND_UPDATE(1)
  12161.   ~GRAF_MOUSE(256,0)
  12162.   BITBLT scr%(),scr%(),par%()
  12163.   ~GRAF_MOUSE(257,0)
  12164.   ~WIND_UPDATE(0)
  12165. RETURN
  12166. PROCEDURE get_down            ! Windowinhalt eine Zeile nach unten
  12167.   .| Glob. Var.: nr%,z.hoehe%,wz%
  12168.   .| Felder    : par%(),tx%(),ty%(),wi%(),scr%()
  12169.   .| Aufruf in : scrolldown-2,
  12170.   par%(0)=tx%(nr%)
  12171.   par%(1)=ty%(nr%)-z.hoehe%+1
  12172.   par%(2)=wi%(nr%,1)+wi%(nr%,3)
  12173.   par%(3)=ty%(nr%)+(wz%-2)*z.hoehe%
  12174.   '
  12175.   par%(4)=par%(0)
  12176.   par%(5)=par%(1)+z.hoehe%
  12177.   par%(6)=par%(2)
  12178.   par%(7)=par%(3)+z.hoehe%
  12179.   '
  12180.   par%(8)=3
  12181.   CLIP OFF
  12182.   ~WIND_UPDATE(1)
  12183.   ~GRAF_MOUSE(256,0)
  12184.   BITBLT scr%(),scr%(),par%()
  12185.   ~GRAF_MOUSE(257,0)
  12186.   ~WIND_UPDATE(0)
  12187. RETURN
  12188. ' ----------------------
  12189. PROCEDURE top(nr%)
  12190.   .| Glob. Var.: z%,xt%,yt%,tz%,hex!,file_open%,fp%,top%,wind%
  12191.   .| Felder    : whdl&()
  12192.   .| Ruft auf  : change,lesen,set_slide,do_list
  12193.   .| Aufruf in : cursor-1,
  12194.   IF nr%=0
  12195.     CLR z%,xt%,yt%,tz%
  12196.     IF hex!=FALSE
  12197.       xt%=51
  12198.     ENDIF
  12199.     IF file_open%=1
  12200.       change
  12201.       CLR fp%
  12202.       lesen
  12203.     ENDIF
  12204.   ELSE
  12205.     top%=1
  12206.   ENDIF
  12207.   set_slide(whdl&(wind%))
  12208.   do_list
  12209. RETURN
  12210. PROCEDURE lend(nr%)
  12211.   .| Glob. Var.: file_open%,fp%,fl%,l_end%,z%,wzb%,xt%,hex!,beg_ascii%,yt%,wz%
  12212.   .|     top%,out%,wind%
  12213.   .| Felder    : whdl&()
  12214.   .| Ruft auf  : change,lesen,set_tz,set_slide,do_list
  12215.   .| Aufruf in : fdc_diskanal-1,ram_check-2,file_verify-1,pfad_compare-3
  12216.   .|     taste-1,alt_t-1,
  12217.   IF nr%=0
  12218.     IF file_open%=1
  12219.       change
  12220.       fp%=MAX(0,fl%-l_end%)
  12221.       lesen
  12222.     ENDIF
  12223.     z%=l_end%-wzb%
  12224.     xt%=45
  12225.     IF hex!=FALSE
  12226.       xt%=beg_ascii%+15
  12227.     ENDIF
  12228.     yt%=wz%-1
  12229.     set_tz
  12230.   ELSE
  12231.     top%=MAX(0,out%-wz%)
  12232.   ENDIF
  12233.   set_slide(whdl&(wind%))
  12234.   do_list
  12235. RETURN
  12236. PROCEDURE down(nr%)
  12237.   .| Glob. Var.: top%,out%,wz%,z%,l_end%,wzb%,mode%,d.isk%,lgs%,spd%,f.ile%
  12238.   .|     file_open%,fp%,fl%,h.ard%,block%,hi_size%,r.am%,ram_addr%,f.dc%
  12239.   .|     track%
  12240.   .| Felder    : wz%(),whdl&()
  12241.   .| Ruft auf  : change,1_down,lesen,redraw,set_slide
  12242.   .| Aufruf in : taste-1,next-1,
  12243.   LOCAL a%
  12244.   '
  12245.   IF nr%=1
  12246.     top%=MIN(MAX(0,out%-wz%),top%+wz%)
  12247.   ELSE
  12248.     '
  12249.     CLR a%
  12250.     IF z%=l_end%-wzb%                   ! schon genau auf Grenze?
  12251.       a%=1
  12252.     ELSE
  12253.       IF z%+wzb%>l_end%-wzb%            ! ist noch Platz zum runter?
  12254.         z%=l_end%-wzb%*2                ! genau auf Grenze ausrichten!
  12255.       ENDIF
  12256.     ENDIF
  12257.     '
  12258.     IF a%=0
  12259.       ADD z%,wzb%
  12260.     ELSE
  12261.       change
  12262.       '
  12263.       SELECT mode%
  12264.       CASE d.isk%
  12265.         lgs%=MIN(spd%-1,lgs%+1)
  12266.         1_down
  12267.       CASE f.ile%
  12268.         IF file_open%=1
  12269.           IF fp%+l_end%<fl%
  12270.             ADD fp%,l_end%
  12271.             1_down
  12272.           ELSE
  12273.             z%=l_end%-wz%(0)*16
  12274.           ENDIF
  12275.         ENDIF
  12276.       CASE h.ard%
  12277.         block%=MAX(0,MIN(hi_size%-1,block%+1))
  12278.         1_down
  12279.       CASE r.am%
  12280.         ADD ram_addr%,l_end%
  12281.         1_down
  12282.       CASE f.dc%
  12283.         CLR z%
  12284.         INC track%
  12285.         lesen
  12286.       ENDSELECT
  12287.     ENDIF
  12288.   ENDIF
  12289.   redraw(nr%)
  12290.   set_slide(whdl&(nr%))
  12291. RETURN
  12292. PROCEDURE 1_down
  12293.   .| Glob. Var.: z%
  12294.   .| Ruft auf  : lesen
  12295.   .| Aufruf in : down-4,
  12296.   CLR z%
  12297.   lesen
  12298. RETURN
  12299. PROCEDURE up(nr%)
  12300.   .| Glob. Var.: top%,wz%,z%,wzb%,mode%,d.isk%,f.ile%,fp%,h.ard%,r.am%,f.dc%
  12301.   .|     bytes%,yt%
  12302.   .| Felder    : whdl&()
  12303.   .| Ruft auf  : change,up_1,dec,set_tz,lesen,redraw,set_slide
  12304.   .| Aufruf in : taste-1,prev-1,c_left-1,
  12305.   LOCAL a%
  12306.   '
  12307.   CLR a%
  12308.   IF nr%=1
  12309.     top%=MAX(1,top%-wz%)
  12310.   ELSE
  12311.     '
  12312.     IF z%=0
  12313.       a%=1
  12314.     ELSE
  12315.       IF z%>=wzb%
  12316.         SUB z%,wzb%
  12317.       ELSE
  12318.         z%=0
  12319.       ENDIF
  12320.     ENDIF
  12321.     '
  12322.     IF a%>0
  12323.       change
  12324.       SELECT mode%
  12325.       CASE d.isk%
  12326.         up_1
  12327.       CASE f.ile%
  12328.         IF fp%<>0
  12329.           up_1
  12330.         ENDIF
  12331.       CASE h.ard%
  12332.         up_1
  12333.       CASE r.am%
  12334.         up_1
  12335.       CASE f.dc%
  12336.         z%=bytes%-wzb%
  12337.         dec
  12338.         yt%=wz%-1
  12339.         set_tz
  12340.         lesen
  12341.       ENDSELECT
  12342.     ENDIF
  12343.   ENDIF
  12344.   redraw(nr%)
  12345.   set_slide(whdl&(nr%))
  12346. RETURN
  12347. PROCEDURE up_1
  12348.   .| Glob. Var.: z%,l_end%,wzb%,yt%,wz%
  12349.   .| Ruft auf  : dec,set_tz,lesen
  12350.   .| Aufruf in : up-4,
  12351.   z%=l_end%-wzb%
  12352.   dec
  12353.   yt%=wz%-1
  12354.   set_tz
  12355.   lesen
  12356. RETURN
  12357. PROCEDURE dec
  12358.   .| Glob. Var.: mode%,d.isk%,lgs%,f.ile%,fp%,l_end%,h.ard%,block%,r.am%
  12359.   .|     ram_addr%,f.dc%,track%
  12360.   .| Aufruf in : dir_secsearch-1,up-1,up_1-1,
  12361.   SELECT mode%
  12362.   CASE d.isk%
  12363.     lgs%=MAX(lgs%-1,0)
  12364.   CASE f.ile%
  12365.     fp%=MAX(0,fp%-l_end%)
  12366.   CASE h.ard%
  12367.     block%=MAX(0,block%-1)
  12368.   CASE r.am%
  12369.     ram_addr%=MAX(ram_addr%-l_end%,0)
  12370.   CASE f.dc%
  12371.     track%=MAX(0,track%-1)
  12372.   ENDSELECT
  12373. RETURN
  12374. PROCEDURE nxt_blk
  12375.   .| Glob. Var.: mode%,d.isk%,lgs%,no_nxt%,spd%,f.ile%,file_open%,fp%,l_end%
  12376.   .|     fl%,h.ard%,block%,hi_size%,r.am%,ram_addr%,ram_max%
  12377.   .| Ruft auf  : test_max,lesen
  12378.   .| Aufruf in : file_dump-1,search-2,search_found-1,
  12379.   SELECT mode%
  12380.   CASE d.isk%
  12381.     INC lgs%
  12382.     no_nxt%=@test_max(lgs%,spd%-1)
  12383.   CASE f.ile%
  12384.     IF file_open%=1
  12385.       ADD fp%,l_end%
  12386.       IF fp%>=fl%
  12387.         SUB fp%,l_end%
  12388.         no_nxt%=1
  12389.       ELSE
  12390.         CLR no_nxt%
  12391.         lesen
  12392.       ENDIF
  12393.     ENDIF
  12394.   CASE h.ard%
  12395.     INC block%
  12396.     no_nxt%=@test_max(block%,hi_size%+1)
  12397.   CASE r.am%
  12398.     ADD ram_addr%,l_end%
  12399.     no_nxt%=@test_max(ram_addr%,ram_max%)
  12400.   ENDSELECT
  12401. RETURN
  12402. FUNCTION test_max(a%,b%)
  12403.   .| Ruft auf  : lesen
  12404.   .| Aufruf in : nxt_blk-3,
  12405.   IF a%>b%
  12406.     RETURN 1
  12407.   ELSE
  12408.     lesen
  12409.     RETURN 0
  12410.   ENDIF
  12411. ENDFUNC
  12412. PROCEDURE address
  12413.   .| Glob. Var.: wind%,la%,el%,file_open%,fp%,mode%,r.am%,ram_addr%,wzb%,z%
  12414.   .| Ruft auf  : eingabe,change,pos_cursor,set_tz,lesen,do_list
  12415.   .|     nur_daten_fenster
  12416.   .| Aufruf in : message_auswerten-1,menu_mess-1,
  12417.   IF wind%=0
  12418.     la%=@eingabe("List-Adresse :",la%)
  12419.     IF el%>0
  12420.       change
  12421.       IF file_open%=1
  12422.         fp%=la%
  12423.       ELSE
  12424.         IF mode%=r.am%
  12425.           ram_addr%=la%
  12426.         ELSE
  12427.           IF la%<=wzb%
  12428.             z%=la%
  12429.           ELSE
  12430.             pos_cursor(la%)
  12431.           ENDIF
  12432.         ENDIF
  12433.       ENDIF
  12434.       pos_cursor(0)
  12435.       set_tz
  12436.       lesen
  12437.       do_list
  12438.     ENDIF
  12439.   ELSE
  12440.     nur_daten_fenster
  12441.   ENDIF
  12442. RETURN
  12443. ' ----------------------
  12444. PROCEDURE get_info(nr%)
  12445.   .| Glob. Var.: info_line$
  12446.   .| Felder    : out$()
  12447.   .| Ruft auf  : info
  12448.   .| Aufruf in : redraw_list-1,info_line-1,stat_line-1,
  12449.   IF nr%=1
  12450.     info_line$=out$(0)
  12451.   ELSE
  12452.     info
  12453.   ENDIF
  12454. RETURN
  12455. PROCEDURE info                  ! INFO-Zeile erstellen je nach MODUS
  12456.   .| Glob. Var.: info_line$,wc%,mode%,d.isk%,lgs%,drive%,track%,spt%,sektor%
  12457.   .|     sid%,seite%,cluster%,anf_dat%,spc%,n$,status%,disk_defekt%,f.ile%,fl%
  12458.   .|     fi_o$,h.ard%,block%,target%,geraet%,h_fehler%,r.am%,ram_addr%,f.dc%
  12459.   .|     sector%,fdrive%,trk_len%
  12460.   .| Felder    : scsi_err$()
  12461.   .| Ruft auf  : dec_hex_val$,getistr$
  12462.   .| Aufruf in : akt_find-1,fdc_diskanal-1,lesen-1,sav_buf-1,sav_block-1
  12463.   .|     print_buf-1,print_blk-1,get_info-1,
  12464.   LOCAL a%,a$,b$,trk#
  12465.   '
  12466.   info_line$=SPACE$(MAX(1,wc%+1))
  12467.   SELECT mode%
  12468.   CASE d.isk%
  12469.     a%=lgs%                       ! logischen Sektor für Anzeige umrechnen
  12470.     IF drive%<2
  12471.       track%=a%/spt%              ! in Track und Sektor
  12472.       sektor%=(a% MOD spt%)+1
  12473.       IF sid%=2
  12474.         trk#=track%/2
  12475.         IF trk#=INT(trk#)
  12476.           CLR seite%
  12477.         ELSE
  12478.           seite%=1
  12479.         ENDIF
  12480.         track%=trk#
  12481.       ELSE
  12482.         CLR seite%
  12483.       ENDIF
  12484.     ENDIF
  12485.     cluster%=INT((lgs%-anf_dat%)/spc%)+2
  12486.     MID$(info_line$,1)="LGS:"+@dec_hex_val$(lgs%,6)+" "
  12487.     IF cluster%<2                 ! Systembereich
  12488.       CLR cluster%
  12489.       IF lgs%>=anf_dir%
  12490.         MID$(info_line$,12)="Clu:_ROOT"
  12491.       ELSE IF lgs%>=anf_fat2% AND (bflag% AND 2)<>0
  12492.         MID$(info_line$,12)="Clu:_FAT "
  12493.       ELSE IF lgs%>=anf_fat2%
  12494.         MID$(info_line$,12)="Clu:_FAT2"
  12495.       ELSE IF lgs%>=anf_fat1%
  12496.         MID$(info_line$,12)="Clu:_FAT1"
  12497.       ELSE
  12498.         MID$(info_line$,12)="Clu:_BOOT"
  12499.       ENDIF
  12500.     ELSE                          ! Datenbereich
  12501.       MID$(info_line$,12)="Clu:"+@dec_hex_val$(cluster%,5)
  12502.     ENDIF
  12503.     IF drive%<2
  12504.       MID$(info_line$,22)="Track:"+@dec_hex_val$(track%,3)
  12505.       MID$(info_line$,32)="Sektor:"+@dec_hex_val$(sektor%,2)
  12506.       MID$(info_line$,42)="Side:"+RIGHT$(n$+STR$(seite%),2)
  12507.     ELSE
  12508.       MID$(info_line$,22)="Track:    Sektor:   Side:"
  12509.     ENDIF
  12510.     MID$(info_line$,50)="Drive:"+CHR$(drive%+65)
  12511.     MID$(info_line$,58)="Status:"
  12512.     IF status%>=0
  12513.       MID$(info_line$,65)=@dec_hex_val$(status%,3)
  12514.     ELSE
  12515.       MID$(info_line$,65)=LEFT$(STR$(status%)+"   ",3)
  12516.     ENDIF
  12517.     IF disk_defekt%=0
  12518.       MID$(info_line$,68)="         "
  12519.     ELSE
  12520.       MID$(info_line$,68)=" XBIOS   "
  12521.     ENDIF
  12522.   CASE f.ile%
  12523.     MID$(info_line$,1)=@dec_hex_val$(fl%,8)
  12524.     a%=MAX(0,wc%-11)
  12525.     IF fi_o$=""
  12526.       MID$(info_line$,10)=STRING$(MAX(0,a%),".")
  12527.     ELSE
  12528.       MID$(info_line$,10)=RIGHT$(fi_o$,a%)
  12529.     ENDIF
  12530.   CASE h.ard%
  12531.     MID$(info_line$,1)="Block:"+@dec_hex_val$(block%,8)
  12532.     MID$(info_line$,17)="Target:"+@dec_hex_val$(target%,2)
  12533.     MID$(info_line$,28)="Gerät:"+STR$(geraet%)
  12534.     IF h_fehler%>=0
  12535.       a$=@dec_hex_val$(h_fehler%,3)
  12536.     ELSE
  12537.       a$=LEFT$(STR$(h_fehler%)+"   ",3)
  12538.     ENDIF
  12539.     IF h_fehler%>=0
  12540.       b$=LEFT$(@getistr$(h_fehler%,0),30)
  12541.     ELSE
  12542.       b$=LEFT$(scsi_err$(ABS(h_fehler%)),30)
  12543.     ENDIF
  12544.     MID$(info_line$,37)="Error:"+a$
  12545.     MID$(info_line$,48)=b$
  12546.   CASE r.am%
  12547.     MID$(info_line$,1)="Adresse:"+@dec_hex_val$(ram_addr%,7)
  12548.   CASE f.dc%
  12549.     MID$(info_line$,1)="Track:"+@dec_hex_val$(track%,3)
  12550.     MID$(info_line$,12)="Sektor:"+@dec_hex_val$(sector%,2)
  12551.     MID$(info_line$,23)="Side:"+STR$(seite%)
  12552.     MID$(info_line$,31)="Drive:"+CHR$(fdrive%+65)
  12553.     MID$(info_line$,40)="Bytes:"+@dec_hex_val$(trk_len%,5)
  12554.   ENDSELECT
  12555. RETURN
  12556. ' ----------------------
  12557. PROCEDURE pexec                 ! Programm starten
  12558.   .| Glob. Var.: f_pexec%,rom_version%
  12559.   .| Ruft auf  : file_is_open,alrt,fsel$,do_pexec
  12560.   .| Aufruf in : hard_install-1,menu_mess-1,
  12561.   LOCAL wwa%,a$,fi$
  12562.   '
  12563.   a$=STR$(MALLOC(-1) DIV 1024)+" KB frei"
  12564.   f_pexec%=-1
  12565.   wwa%=1
  12566.   file_is_open
  12567.   IF rom_version%<&H104
  12568.     wwa%=@alrt(2,"Programm ausführen?|"+a$,1,"Ok|Abbruch")
  12569.   ENDIF
  12570.   IF wwa%=1
  12571.     fi$=@fsel$("*.*","","PRG ausführen ("+a$+")",25)
  12572.     do_pexec(fi$)
  12573.   ENDIF
  12574. RETURN
  12575. PROCEDURE do_pexec(fi$)
  12576.   .| Glob. Var.: f_pexec%,a%,scr_handle%,scr_width%,scr_height%,z.b%,z.h%,dx%
  12577.   .|     dy%,dw%,rom_version%,dh%
  12578.   .| Ruft auf  : eintext,set_pfad,get_pfad,desktop_weg,v_enter_cur,v_exit_cur
  12579.   .|     vs_clip,v_gtext,v_line,mtasse,alrt,wind_new,desktop_back
  12580.   .| Aufruf in : hard_install-1,pexec-1,
  12581.   LOCAL a$,b$,i%,env%,wwa%,erg2%,tpin$,ttp$,env$
  12582.   '
  12583.   IF EXIST(fi$)=TRUE
  12584.     f_pexec%=-1
  12585.     a$=CHR$(0)
  12586.     a%=RINSTR(fi$,"\")
  12587.     b$=RIGHT$(fi$,LEN(fi$)-a%)
  12588.     erg2%=1
  12589.     IF RIGHT$(fi$,3)="TTP"
  12590.       eintext("Parameter: "+b$+":",tpin$)
  12591.       erg2%=LEN(a$)
  12592.       tpin$=a$
  12593.       ttp$=CHR$(LEN(a$)+1)+a$+CHR$(0)
  12594.     ELSE
  12595.       ttp$=CHR$(0)+CHR$(0)
  12596.     ENDIF
  12597.     IF erg2%>0
  12598.       env%=LPEEK(BASEPAGE+&H2C)
  12599.       WHILE BYTE{env%} OR BYTE{env%+1} OR BYTE{env%+2}
  12600.         env$=env$+CHR$(BYTE{env%})
  12601.         INC env%
  12602.       WEND
  12603.       env$=env$+CHR$(0)+CHR$(0)+CHR$(0)
  12604.       set_pfad(fi$)
  12605.       get_pfad
  12606.       desktop_weg
  12607.       '
  12608.       b$=RIGHT$(fi$,3)
  12609.       IF b$="TTP" OR b$="TOS"
  12610.         v_enter_cur(scr_handle%)
  12611.       ELSE
  12612.         ' v_exit_cur(scr_handle%)
  12613.         ~FORM_DIAL(3,0,0,scr_width%,scr_height%,0,0,scr_width%,scr_height%)
  12614.         ~EVNT_TIMER(100)
  12615.         vs_clip(scr_handle%,0,0,0,0,0)
  12616.         CLIP OFF
  12617.         v_gtext((scr_width%-LEN(fi$)*z.b%)/2,z.h%,fi$)
  12618.         v_line(scr_handle%,dx%,dy%-1,dw%-1,dy%-1)
  12619.         mtasse
  12620.         ~SHEL_WRITE(1,1,1,ttp$,fi$)
  12621.       ENDIF
  12622.       '
  12623.       a%=GEMDOS(75,0,L:V:fi$,L:V:ttp$,L:V:env$)<>0
  12624.       IF a%<>0
  12625.         ~@alrt(3,"PEXEC-Fehler "+STR$(a%)+"|oder|Programm meldet "+STR$(a% AND &HFFFF),1," &%$§ ")
  12626.       ELSE
  12627.         CLR f_pexec%
  12628.         IF b$="TTP"
  12629.           PRINT " Taste drücken ... "
  12630.           ~INP(2)
  12631.         ENDIF
  12632.       ENDIF
  12633.       '
  12634.       IF b$="TTP" OR b$="TOS"
  12635.         v_exit_cur(scr_handle%)
  12636.       ELSE
  12637.         ~SHEL_WRITE(1,1,1,"","EXIT.PRG")
  12638.         IF CARD{LONG{GB+4}}>=&H140
  12639.           wind_new
  12640.         ENDIF
  12641.       ENDIF
  12642.       ~FORM_DIAL(3,0,0,0,0,dx%,dy%,dw%,dh%)
  12643.       desktop_back
  12644.     ENDIF
  12645.   ENDIF
  12646. RETURN
  12647. PROCEDURE start_shell           ! Shell aufrufen
  12648.   .| Glob. Var.: scr_handle%,pfad$,shell_p%,dx%,dy%,dw%,dh%
  12649.   .| Ruft auf  : file_is_open,desktop_weg,v_enter_cur,get_pfad,v_exit_cur
  12650.   .|     desktop_back
  12651.   .| Aufruf in : menu_mess-1,
  12652.   LOCAL a%,a$,ret&,com$,drive%
  12653.   file_is_open
  12654.   desktop_weg
  12655.   v_enter_cur(scr_handle%)
  12656.   DO
  12657.     drive%=GEMDOS(25) AND 255   ! Aktuelles Laufwerk
  12658.     get_pfad
  12659.     PRINT pfad$;" # ";
  12660.     a$=""
  12661.     DO
  12662.       a%=BIOS(2,2) AND 255
  12663.       EXIT IF a%=13 OR a%=10 OR a%=4 OR a%=26   ! CR, LF, ^D, ^Z
  12664.       IF a%<32
  12665.         IF a%=8
  12666.           IF a$<>""
  12667.             a$=LEFT$(a$,LEN(a$)-1)
  12668.             PRINT CHR$(8);" ";CHR$(8);
  12669.           ENDIF
  12670.         ELSE
  12671.           PRINT CHR$(7);
  12672.         ENDIF
  12673.       ELSE
  12674.         IF LEN(a$)<80
  12675.           a$=a$+CHR$(a%)
  12676.           PRINT CHR$(a%);
  12677.         ELSE
  12678.           PRINT CHR$(7);
  12679.         ENDIF
  12680.       ENDIF
  12681.     LOOP
  12682.     PRINT
  12683.     EXIT IF a$="" OR UPPER$(a$)="EXIT"
  12684.     com$=a$+CHR$(0)
  12685.     ret&=(C:shell_p%(L:VARPTR(com$))) AND &HFF
  12686.     VOID XBIOS(21,2)
  12687.     VOID XBIOS(21,1)
  12688.     IF ret&>0
  12689.       IF ret&>&H7F
  12690.         ret&=ret&-256
  12691.       ENDIF
  12692.       OPEN "O",#1,"vid:"
  12693.       PRINT #1,a$;
  12694.       CLOSE #1
  12695.       PRINT ": Fehler "+STR$(ret&)
  12696.     ENDIF
  12697.   LOOP
  12698.   v_exit_cur(scr_handle%)
  12699.   ~FORM_DIAL(3,0,0,0,0,dx%,dy%,dw%,dh%)
  12700.   desktop_back
  12701. RETURN
  12702. PROCEDURE about_me
  12703.   .| Glob. Var.: ver$
  12704.   .| Ruft auf  : alrt,opt_help
  12705.   .| Aufruf in : menu_mess-1,
  12706.   LOCAL wwa%
  12707.   wwa%=@alrt(4,ver$+"|Modifiziert 1995-04-04 von Rainer Seitel @ KA|Der etwas andere Diskmonitor |aus dem SCHEIBENKLEISTER",4,"Kleister|SED|Hilfe|Danke")
  12708.   SELECT wwa%
  12709.   CASE 1
  12710.     ~@alrt(1,"Das Buch zum Thema 'Massenspeicher am ST'|       - unbedingt lesen - ",1,"  Aha  ")
  12711.   CASE 2
  12712.     ~@alrt(1,ver$+" ist nicht PD-Software!! ",1,"  Aha  ")
  12713.   CASE 3
  12714.     opt_help
  12715.   ENDSELECT
  12716. RETURN
  12717. PROCEDURE exit                  ! Programm verlassen?
  12718.   .| Glob. Var.: wind%
  12719.   .| Ruft auf  : change,alrt,file_is_open,do_exit,do_cursor_anz,maus_off
  12720.   .| Aufruf in : menu_mess-1,
  12721.   change
  12722.   IF @alrt(2,"Ist für heute wirklich Schluß?",1," Schluß |Nie")=1
  12723.     file_is_open
  12724.     do_exit
  12725.   ENDIF
  12726.   do_cursor_anz(wind%)
  12727.   maus_off
  12728. RETURN
  12729. PROCEDURE do_exit
  12730.   .| Glob. Var.: buf%,fatbuf%,help_mem%,prg_adr%,neuefonts%,menu_pointer%
  12731.   .|     repflag%,sed_pfad$,scr_handle%
  12732.   .| Felder    : mem%(),whdl&()
  12733.   .| Ruft auf  : chk_fdc,set_pfad,v_clsvwk
  12734.   .| Aufruf in : rsc_init-1,little_event_multi-1,wind_open-1,exit-1
  12735.   .|     bios_block-2,fehler_behandlung-1,
  12736.   chk_fdc
  12737.   ~MFREE(buf%)
  12738.   ~MFREE(fatbuf%)
  12739.   IF mem%(0)>0
  12740.     ~MFREE(mem%(0))
  12741.   ENDIF
  12742.   IF help_mem%>0
  12743.     ~MFREE(help_mem%)
  12744.   ENDIF
  12745.   IF prg_adr%>0
  12746.     ~MFREE(prg_adr%)
  12747.   ENDIF
  12748.   IF neuefonts%>0
  12749.     ~VST_UNLOAD_FONTS(0)
  12750.   ENDIF
  12751.   '
  12752.   ~WIND_CLOSE(whdl&(0))
  12753.   ~WIND_CLOSE(whdl&(1))
  12754.   ~WIND_DELETE(whdl&(0))
  12755.   ~WIND_DELETE(whdl&(1))
  12756.   ~MENU_BAR(menu_pointer%,0)
  12757.   ~RSRC_FREE()
  12758.   SPOKE &H484,repflag%
  12759.   set_pfad(sed_pfad$)           ! Alten Pfad wieder einstellen
  12760.   IF scr_handle%>0
  12761.     v_clsvwk(scr_handle%)
  12762.   ENDIF
  12763.   IF BYTE{BASEPAGE+256}=96
  12764.     RESERVE
  12765.     EDIT
  12766.   ELSE
  12767.     END
  12768.   ENDIF
  12769. RETURN
  12770. PROCEDURE look_ex
  12771.   .| Glob. Var.: device%,erg%,f.eed%,hdl%,f.eedcode%
  12772.   .| Ruft auf  : fwrite,fclose,do_list
  12773.   .| Aufruf in : hard_mode_sense-1,out_do-1,disc_save-1,file_dump-1,sav_buf-1
  12774.   .|     sav_block-1,print_buf-1,print_blk-1,text_dev-1,
  12775.   IF device%<>99
  12776.     IF erg%=2 AND f.eed%<>0
  12777.       fwrite(hdl%,CHR$(f.eedcode%))
  12778.     ENDIF
  12779.     ~@fclose(hdl%)
  12780.     do_list
  12781.   ENDIF
  12782. RETURN
  12783. ' ----------------------
  12784. PROCEDURE search              ! Suchen & Ersetzen
  12785.   .| Glob. Var.: wind%,z%,tz%,such%,top%,txt_zeile%,txt_spalte%,searchok&
  12786.   .|     found!,no_nxt%,search$,search_block%,buf_end%,buf_beg%,search_cont%
  12787.   .|     in1$,in2$,i%,buf%,tbuf_end%,tbuf_beg%,tblkaz%,tblkas%,s.earch%
  12788.   .|     search1&,search2&,w$,replace$,mendx4&,l_end%,mode%,f.ile%,abb%
  12789.   .|     file_open%,f.dc%,b%,out%,d.isk%,lgs%,fp%,h.ard%,block%,r.am%
  12790.   .|     ram_addr%
  12791.   .| Felder    : out$(),men_ienable%()
  12792.   .| Ruft auf  : coff,put_char,box_draw,form_do,clr_state,box_undraw,get_char$
  12793.   .|     wandlung,set_menu,nxt_blk,search_lesen,was_ist,alrt,search_found
  12794.   .|     ctrl_h
  12795.   .| Aufruf in : alt_q-1,ctrl_f-1,ctrl_g-1,
  12796.   LOCAL a%,ex_obj&,sz%,a$,b$,c$,bb$,ffb%,sbg%
  12797.   '
  12798.   coff
  12799.   IF wind%=0
  12800.     sz%=z%+tz%+2
  12801.   ELSE
  12802.     such%=top%+txt_zeile%-1
  12803.     sz%=txt_spalte%+1
  12804.   ENDIF
  12805.   ex_obj&=searchok&
  12806.   CLR found!,no_nxt%,search$
  12807.   '
  12808.   IF wind%=0
  12809.     search_block%=buf_end%-buf_beg%
  12810.     IF search_block%>=0 AND search_cont%=0
  12811.       CLR in1$,in2$
  12812.       FOR i%=0 TO MIN(5,search_block%)
  12813.         in1$=in1$+"$"+HEX$(BYTE{buf%+buf_beg%+i%},2)+","
  12814.       NEXT i%
  12815.       in1$=LEFT$(in1$,LEN(in1$)-1)
  12816.     ENDIF
  12817.   ELSE
  12818.     search_block%=tbuf_end%-tbuf_beg%
  12819.     IF search_block%>=0 AND search_cont%=0
  12820.       CLR in2$
  12821.       in1$=CHR$(34)+MID$(out$(tblkaz%),tblkas%,MIN(10,search_block%))+CHR$(34)
  12822.     ENDIF
  12823.   ENDIF
  12824.   '
  12825.   IF search_cont%=0
  12826.     put_char(s.earch%,search1&,in1$)
  12827.     put_char(s.earch%,search2&,in2$)
  12828.     box_draw(s.earch%)
  12829.     ex_obj&=@form_do(s.earch%) AND &HFF
  12830.     clr_state(s.earch%,ex_obj&,1)
  12831.     box_undraw(s.earch%)
  12832.   ENDIF
  12833.   IF ex_obj&=searchok&
  12834.     in1$=@get_char$(s.earch%,search1&)
  12835.     in2$=@get_char$(s.earch%,search2&)
  12836.     wandlung(in1$)
  12837.     search$=w$
  12838.     wandlung(in2$)
  12839.     replace$=w$
  12840.     men_ienable%(mendx4&)=1
  12841.     set_menu
  12842.     '
  12843.     IF LEN(search$)>0
  12844.       '
  12845.       IF wind%=0
  12846.         sbg%=32767/l_end%               ! Anzahl der Blocks
  12847.         IF mode%=f.ile%
  12848.           sbg%=2
  12849.         ENDIF
  12850.         a%=(ASC(search$)+1) AND &HFF    ! Füllmuster nach Suchstring ändern!
  12851.         bb$=STRING$(sbg%*l_end%,a%)     ! Puffer zum Suchen mit INSTR
  12852.         BMOVE buf%,V:bb$,l_end%
  12853.         '
  12854.         IF mode%=f.ile%
  12855.           ffb%=INSTR(sz%,bb$,search$)   ! erst im Puffer suchen
  12856.           IF ffb%=0
  12857.             nxt_blk
  12858.             search_lesen(sbg%-1)
  12859.           ENDIF
  12860.         ELSE
  12861.           ffb%=INSTR(sz%,bb$,search$)
  12862.           IF ffb%=0
  12863.             nxt_blk
  12864.             search_lesen(sbg%-1)
  12865.           ENDIF
  12866.         ENDIF
  12867.       ENDIF
  12868.       '
  12869.       DO
  12870.         abb%=@was_ist
  12871.         IF (mode%=f.ile% AND file_open%<>1)
  12872.           ~@alrt(3,"In welcher Datei suchen?",1,"Ach so")
  12873.           abb%=1
  12874.         ENDIF
  12875.         IF mode%=f.dc%
  12876.           ~@alrt(3,"Das funktioniert noch nicht!",1,"Abbruch")
  12877.           abb%=1
  12878.         ENDIF
  12879.         EXIT IF abb%>0
  12880.         '
  12881.         IF wind%=0
  12882.           BMOVE buf%,V:bb$,LEN(bb$)     ! gelesene Daten in String
  12883.           b%=INSTR(sz%,bb$,search$)     ! und dort suchen
  12884.         ELSE
  12885.           INC such%
  12886.           IF such%>=out%
  12887.             no_nxt%=1
  12888.           ENDIF
  12889.           b%=INSTR(sz%,out$(such%),search$) ! dasselbe wenn Textfenster
  12890.         ENDIF
  12891.         '
  12892.         IF b%>0                 ! was gefunden?
  12893.           found!=TRUE
  12894.           search_found(b%)
  12895.         ELSE
  12896.           sz%=1                 ! nichts gefunden
  12897.         ENDIF
  12898.         EXIT IF found!=TRUE OR no_nxt%=1
  12899.         '
  12900.         IF wind%=0
  12901.           SELECT mode%          ! nix gefunden - weitersuchen
  12902.           CASE d.isk%
  12903.             ADD lgs%,sbg%-1
  12904.           CASE f.ile%
  12905.             ADD fp%,(sbg%-1)*l_end%
  12906.           CASE h.ard%
  12907.             ADD block%,sbg%-1
  12908.           CASE r.am%
  12909.             ADD ram_addr%,(sbg%-1)*l_end%
  12910.           ENDSELECT
  12911.         ENDIF
  12912.         BMOVE buf%+(sbg%-1)*l_end%,buf%,l_end% ! letzten Block nach vorne holen
  12913.         search_lesen(sbg%-1)                   ! ab 2. Block im String lesen
  12914.         '
  12915.       LOOP
  12916.       '
  12917.       IF abb%>0
  12918.         ctrl_h
  12919.       ENDIF
  12920.       IF no_nxt%=1 AND found!=FALSE AND ex_obj&=searchok& AND search$<>""
  12921.         ~@alrt(3,"Keine (weitere) |Fundstelle!",1," Ok ")
  12922.         ctrl_h
  12923.       ENDIF
  12924.       '
  12925.     ENDIF
  12926.   ENDIF
  12927.   CLR bb$
  12928. RETURN
  12929. PROCEDURE search_lesen(a2%)
  12930.   .| Glob. Var.: buf%,l_end%,no_nxt%,mode%,d.isk%,lll%,lgs%,spd%,status%
  12931.   .|     drive%,f.ile%,file_open%,fp%,f_hdl%,fl%,bb$,h.ard%,block%,hi_size%
  12932.   .|     r.am%,ram_addr%,ram_max%,utis%
  12933.   .| Felder    : whdl&()
  12934.   .| Ruft auf  : err_inf,fseek,fread2,scsicall,hard_err,set_slide
  12935.   .| Aufruf in : search-3,
  12936.   LOCAL a$,a1%
  12937.   '
  12938.   a1%=buf%+l_end%
  12939.   '
  12940.   CLR no_nxt%
  12941.   SELECT mode%
  12942.   CASE d.isk%
  12943.     lll%=lgs%
  12944.     IF lgs%+a2%>spd%
  12945.       a2%=spd%-lgs%
  12946.       no_nxt%=1
  12947.     ENDIF
  12948.     status%=@rwabs(2,a1%,a2%,lgs%,drive%)
  12949.     err_inf(status%)
  12950.   CASE f.ile%
  12951.     IF file_open%=1
  12952.       ~@fseek(fp%,f_hdl%,0)
  12953.       IF fp%+a2%*l_end%>=fl%    ! über Datei hinaus?
  12954.         a2%=fl%-fp%
  12955.         fread2(f_hdl%,a1%,a2%)
  12956.         a$=STRING$(LEN(bb$)-LEN(a$),0)
  12957.         BMOVE V:a$,a1%+a2%,LEN(a$)
  12958.         CLR a$
  12959.         no_nxt%=1
  12960.       ELSE                      ! normal
  12961.         fread2(f_hdl%,a1%,a2%*l_end%)
  12962.       ENDIF
  12963.     ENDIF
  12964.   CASE h.ard%
  12965.     lll%=block%
  12966.     IF block%+a2%>hi_size%-1
  12967.       a2%=hi_size%-1-block%
  12968.       no_nxt%=1
  12969.     ENDIF
  12970.     scsicall(8,block%,a2%,0,a1%,6,4)
  12971.     hard_err
  12972.   CASE r.am%
  12973.     IF ram_addr%+a2%*l_end%>ram_max%
  12974.       a2%=ram_max%-ram_addr%/l_end%
  12975.       no_nxt%=1
  12976.     ENDIF
  12977.     ~C:utis%(&H600,L:ram_addr%,L:a1%,L:a2%*l_end%-1)
  12978.   ENDSELECT
  12979.   set_slide(whdl&(0))
  12980. RETURN
  12981. PROCEDURE search_found(wo%)   ! wenn was gefunden
  12982.   .| Glob. Var.: b%,wind%,ffb%,lll%,l_end%,mode%,d.isk%,lgs%,h.ard%,block%
  12983.   .|     r.am%,ram_addr%,buf%,search$,replace$,ch%,tz%,z%,a%,a$,no_nxt%,top%
  12984.   .|     such%,txt_zeile%,b$,c$
  12985.   .| Felder    : out$(),whdl&()
  12986.   .| Ruft auf  : pos_cursor,set_found_block,set_crcbuf,change,nxt_blk
  12987.   .|     set_slide
  12988.   .| Aufruf in : search-1,
  12989.   LOCAL lx%
  12990.   '
  12991.   CLR lx%
  12992.   b%=wo%-1
  12993.   IF wind%=0                    ! Datenfenster
  12994.     IF ffb%=0                   ! wurde gelesen?
  12995.       DEC lll%                  ! ja, mehrere Blocks gelesen ...
  12996.       WHILE b%>l_end%-1         ! feststellen in welchem Block
  12997.         INC lll%
  12998.         INC lx%
  12999.         SUB b%,l_end%
  13000.       WEND
  13001.       SELECT mode%
  13002.       CASE d.isk%
  13003.         lgs%=lll%               ! Sektornummer anpassen
  13004.       CASE h.ard%
  13005.         block%=lll%
  13006.       CASE r.am%
  13007.         ADD ram_addr%,lx%*l_end%-l_end%
  13008.       ENDSELECT
  13009.       '
  13010.       BMOVE buf%+(lx%*l_end%),buf%,l_end%       ! richtigen Block in Puffer
  13011.     ENDIF
  13012.     pos_cursor(b%)
  13013.     set_found_block(b%,LEN(search$))
  13014.     set_crcbuf
  13015.     '
  13016.     IF LEN(replace$)>0
  13017.       INC ch%
  13018.       IF tz%+z%+LEN(replace$)>l_end%
  13019.         a%=l_end%-(tz%+z%)                      ! Rest des Sektors
  13020.         a$=RIGHT$(replace$,LEN(replace$)-a%)
  13021.         BMOVE V:replace$,buf%+z%+tz%,a%
  13022.         CLR tz%,z%
  13023.         change
  13024.         IF no_nxt%=0
  13025.           nxt_blk
  13026.           BMOVE V:a$,buf%+z%+tz%,LEN(a$)
  13027.         ENDIF
  13028.         CLR a$
  13029.       ELSE
  13030.         BMOVE V:replace$,buf%+z%+tz%,LEN(replace$)
  13031.       ENDIF
  13032.     ENDIF
  13033.     '
  13034.   ELSE
  13035.     '           Textfenster
  13036.     top%=such%
  13037.     CLR txt_zeile%
  13038.     IF LEN(replace$)>0
  13039.       a$=out$(top%)
  13040.       b$=LEFT$(a$,b%-1)+replace$
  13041.       c$=RIGHT$(a$,LEN(a$)-(b%+LEN(search$))+1)
  13042.       out$(top%)=b$+c$
  13043.       INC ch%
  13044.     ENDIF
  13045.     set_found_block(b%,LEN(search$))
  13046.   ENDIF
  13047.   set_slide(whdl&(wind%))
  13048. RETURN
  13049. PROCEDURE wandlung(in$)
  13050.   .| Glob. Var.: w$,s%
  13051.   .| Ruft auf  : alrt
  13052.   .| Aufruf in : fdc_null-1,search-2,
  13053.   LOCAL i%,il%,j%,h$,h%
  13054.   CLR h$,w$
  13055.   i%=1
  13056.   il%=LEN(in$)
  13057.   DO
  13058.     EXIT IF i%>il%
  13059.     IF MID$(in$,i%,1)="," OR MID$(in$,i%,1)=" "
  13060.       INC i%
  13061.     ENDIF
  13062.     IF MID$(in$,i%,1)="$"
  13063.       CLR h$
  13064.       DO
  13065.         INC i%
  13066.         EXIT IF i%>il% OR MID$(in$,i%,1)=","
  13067.         h$=h$+MID$(in$,i%,1)
  13068.       LOOP
  13069.       IF FRAC(LEN(h$)/2)<>0 OR LEN(h$)=0
  13070.         ~@alrt(3,"Hex-Data falsch! ",1," Ok ")
  13071.         CLR h$
  13072.         i%=il%+1
  13073.       ENDIF
  13074.       FOR j%=1 TO LEN(h$) STEP 2
  13075.         w$=w$+CHR$(VAL("&H"+MID$(h$,j%,2)))
  13076.       NEXT j%
  13077.     ELSE
  13078.       IF MID$(in$,i%,1)>="0" AND MID$(in$,i%,1)<="9"
  13079.         CLR h$
  13080.         DO
  13081.           EXIT IF i%>il% OR MID$(in$,i%,1)=","
  13082.           h$=h$+MID$(in$,i%,1)
  13083.           INC i%
  13084.         LOOP
  13085.         h%=VAL(h$)
  13086.         IF h%>255
  13087.           ~@alrt(3,"Dezimale Werte |zwischen 0 und 255!",1," Ok ")
  13088.           h%=h% AND 255
  13089.         ENDIF
  13090.         w$=w$+CHR$(h%)
  13091.       ELSE
  13092.         IF MID$(in$,i%,1)="%"
  13093.           CLR h$
  13094.           DO
  13095.             INC i%
  13096.             EXIT IF i%>il% OR MID$(in$,i%,1)=","
  13097.             h$=h$+MID$(in$,i%,1)
  13098.           LOOP
  13099.           INC i%
  13100.           s%=VAL("&X"+h$)
  13101.           IF s%>255
  13102.             ~@alrt(3,"Binäre Werte max. 8 Bit! ",1," Ok ")
  13103.             s%=s% AND 255
  13104.           ENDIF
  13105.           w$=w$+CHR$(s%)
  13106.         ELSE
  13107.           IF MID$(in$,i%,1)=CHR$(34)
  13108.             DO
  13109.               INC i%
  13110.               EXIT IF i%>il% OR MID$(in$,i%,1)=CHR$(34)
  13111.               w$=w$+MID$(in$,i%,1)
  13112.             LOOP
  13113.             INC i%
  13114.           ENDIF
  13115.         ENDIF
  13116.       ENDIF
  13117.       INC i%
  13118.     ENDIF
  13119.   LOOP
  13120. RETURN
  13121. PROCEDURE set_found_block(wo%,l%)
  13122.   .| Glob. Var.: wind%,utis%,ak%,l_end%,txt_spalte%,tbuf_beg%,top%,tbuf_end%
  13123.   .| Ruft auf  : menu_blkhide,set_var_txt,set_stat,do_list
  13124.   .| Aufruf in : search_found-2,
  13125.   IF wind%=0
  13126.     ~C:utis%(&H300,L:ak%,L:l_end%-1)      ! alten Block löschen
  13127.     ~C:utis%(&H301,L:ak%+wo%,L:l%-1)      ! neuen Block setzen
  13128.     menu_blkhide(1)                       ! Menü erlauben
  13129.   ELSE
  13130.     txt_spalte%=wo%+1
  13131.     tbuf_beg%=top%*255+txt_spalte%
  13132.     tbuf_end%=top%*255+txt_spalte%+l%
  13133.     set_var_txt
  13134.     set_stat
  13135.     do_list
  13136.   ENDIF
  13137. RETURN
  13138. '
  13139. PROCEDURE einname(txt$,ta$)
  13140.   .| Glob. Var.: e.inname%,txtname&,einerg&,einok&,a$
  13141.   .| Ruft auf  : put_char,box_draw,form_do,box_undraw,clr_state,get_char$
  13142.   .|     einexit
  13143.   .| Aufruf in : last_5-1,datei_suchen-1,dir_fldren-1,
  13144.   LOCAL ex_obj&
  13145.   '
  13146.   put_char(e.inname%,txtname&,txt$)
  13147.   put_char(e.inname%,einerg&,ta$)
  13148.   box_draw(e.inname%)
  13149.   ex_obj&=@form_do(e.inname%) AND &HFF
  13150.   box_undraw(e.inname%)
  13151.   clr_state(e.inname%,ex_obj&,1)
  13152.   '
  13153.   IF ex_obj&=einok&
  13154.     a$=@get_char$(e.inname%,einerg&)
  13155.   ELSE
  13156.     CLR a$
  13157.   ENDIF
  13158.   einexit
  13159. RETURN
  13160. PROCEDURE eintext(txt$,ta$)
  13161.   .| Glob. Var.: e.ingabe%,etext&,ergebnis&,eok&,a$
  13162.   .| Ruft auf  : put_char,box_draw,form_do,box_undraw,clr_state,get_char$
  13163.   .|     einexit
  13164.   .| Aufruf in : do_pexec-1,test_suche-1,
  13165.   LOCAL ex_obj&
  13166.   '
  13167.   put_char(e.ingabe%,etext&,txt$)
  13168.   put_char(e.ingabe%,ergebnis&,ta$)
  13169.   box_draw(e.ingabe%)
  13170.   ex_obj&=@form_do(e.ingabe%) AND 255
  13171.   box_undraw(e.ingabe%)
  13172.   clr_state(e.ingabe%,ex_obj&,1)
  13173.   '
  13174.   IF ex_obj&=eok&
  13175.     a$=@get_char$(e.ingabe%,ergebnis&)
  13176.   ELSE
  13177.     CLR a$
  13178.   ENDIF
  13179.   einexit
  13180. RETURN
  13181. PROCEDURE einexit
  13182.   .| Glob. Var.: el%,a$,e.l%
  13183.   .| Aufruf in : einname-1,eintext-1,
  13184.   el%=LEN(a$)
  13185.   CLR e.l%
  13186.   IF el%=0
  13187.     e.l%=1
  13188.   ENDIF
  13189. RETURN
  13190. ' ----------------------  INFO -------------------------
  13191. PROCEDURE infos
  13192.   .| Glob. Var.: i.nfos%
  13193.   .| Ruft auf  : box_draw,form_do,box_undraw,clr_state,info_system
  13194.   .|     info_kleine_buttons,info_fkey,info_platten
  13195.   .| Aufruf in : menu_mess-1,
  13196.   LOCAL ex_obj&
  13197.   box_draw(i.nfos%)
  13198.   ex_obj&=@form_do(i.nfos%) AND &HFF
  13199.   box_undraw(i.nfos%)
  13200.   clr_state(i.nfos%,ex_obj&,1)
  13201.   ON ex_obj& GOSUB info_system,info_kleine_buttons,info_fkey,info_platten
  13202. RETURN
  13203. PROCEDURE info_system
  13204.   .| Glob. Var.: erg%,l$,scr_mem%,bps%,rom_version%,romstart%,scr_width%
  13205.   .|     scr_height%,fonts%,neuefonts%,chk_ofls%
  13206.   .| Ruft auf  : clr_out,out,out_do
  13207.   .| Aufruf in : infos-1,
  13208.   LOCAL a$
  13209.   '
  13210.   erg%=3
  13211.   clr_out("SYSTEM-INFO")
  13212.   out("")
  13213.   a$=" frei"
  13214.   IF GEMDOS(68,L:-1,0)<>-32
  13215.     out("Standard-RAM    :"+RIGHT$(l$+STR$(GEMDOS(68,L:-1,0)),10)+" Bytes"+a$)
  13216.     out("Alternate-RAM   :"+RIGHT$(l$+STR$(GEMDOS(68,L:-1,1)),10)+" Bytes"+a$)
  13217.   ELSE
  13218.     out("System-RAM      :"+RIGHT$(l$+STR$(MALLOC(-1)),10)+" Bytes")
  13219.   ENDIF
  13220.   out("internes RAM    :"+RIGHT$(l$+STR$(FRE(0)),10)+" Bytes"+a$)
  13221.   out("Dialogpuffer    :"+RIGHT$(l$+STR$(scr_mem%),10)+" Bytes")
  13222.   out("Akt. Puffergröße:"+RIGHT$(l$+STR$(bps%),10)+" Bytes")
  13223.   out("")
  13224.   out("ROM-Version     :   "+HEX$(rom_version%))
  13225.   out("ROM-Start       :   $"+HEX$(romstart%))
  13226.   out("")
  13227.   out("Auflösung       :   "+STR$(scr_width%)+"*"+STR$(scr_height%))
  13228.   IF GDOS?
  13229.     out("GDOS-Fonts      :   "+STR$(fonts%+neuefonts%))
  13230.   ENDIF
  13231.   out("")
  13232.   IF chk_ofls%>0
  13233.     out("CHK_OFLS  installiert")
  13234.   ENDIF
  13235.   out_do
  13236. RETURN
  13237. PROCEDURE info_crc
  13238.   .| Glob. Var.: wind%,buf_end%,buf_beg%,utis%,buf%
  13239.   .| Ruft auf  : alrt,nur_daten_fenster
  13240.   .| Aufruf in : menu_mess-1,
  13241.   LOCAL a$,crc%,wwa%
  13242.   '
  13243.   IF wind%=0
  13244.     IF buf_end%-buf_beg%>0
  13245.       wwa%=@alrt(2,"CRC-Startwert ",1,"CDB4|FFFF")
  13246.       crc%=&HCDB4
  13247.       IF wwa%=2
  13248.         crc%=&HFFFF
  13249.       ENDIF
  13250.       crc%=C:utis%(&H400,L:buf%+buf_beg%,L:buf_end%-buf_beg%+1,L:crc%)
  13251.       a$=HEX$(crc% AND &HFFFF,4)
  13252.       ~@alrt(1,"CRC-Prüfsumme des|markierten Blocks:|$"+a$,1," OK ")
  13253.     ELSE
  13254.       ~@alrt(3,"Kein Block markiert!",1,"Hmmmm")
  13255.     ENDIF
  13256.   ELSE
  13257.     nur_daten_fenster
  13258.   ENDIF
  13259. RETURN
  13260. '
  13261. PROCEDURE info_fkey     ! Funktionstastenbelegung anzeigen/ändern
  13262.   .| Glob. Var.: erg%,n$
  13263.   .| Felder    : flos$()
  13264.   .| Ruft auf  : clr_out,out,out_do,set_last
  13265.   .| Aufruf in : infos-1,last_9-1,
  13266.   LOCAL a%,i%,a$
  13267.   erg%=3
  13268.   clr_out("Funktionstastenbelegung:")
  13269.   out("Nr. Länge                 Inhalt")
  13270.   out("")
  13271.   FOR i%=1 TO 10
  13272.     a%=VAL(flos$(0,i%))/2
  13273.     a$="F"+RIGHT$(n$+STR$(i%),2)+"  "+RIGHT$(n$+STR$(a%),4)
  13274.     IF a%>0
  13275.       a$=a$+" "+LEFT$(flos$(1,i%),60)
  13276.     ENDIF
  13277.     out(a$)
  13278.   NEXT i%
  13279.   out_do
  13280.   set_last(9)
  13281. RETURN
  13282. PROCEDURE last_9
  13283.   .| Glob. Var.: top%,txt_zeile%,buf_end%,buf_beg%,wwa%
  13284.   .| Felder    : flos$()
  13285.   .| Ruft auf  : alrt,put_to_fkey,info_fkey,floskel
  13286.   .| Aufruf in : maus_pos-1,
  13287.   LOCAL a%
  13288.   a%=top%+txt_zeile%-2
  13289.   IF a%>0 AND a%<11
  13290.     IF buf_end%>buf_beg%
  13291.       wwa%=1
  13292.       IF VAL(flos$(0,a%))<>0
  13293.         wwa%=@alrt(2,"Funktionstaste ist belegt!",1,"Belegen|in Puffer|Abbruch")
  13294.       ENDIF
  13295.       IF wwa%=1
  13296.         put_to_fkey(a%)
  13297.         info_fkey
  13298.       ELSE
  13299.         floskel(a%+58)
  13300.       ENDIF
  13301.     ENDIF
  13302.   ENDIF
  13303. RETURN
  13304. '
  13305. PROCEDURE info_kleine_buttons   ! Belegung der kleinen Buttons anzeigen/ändern
  13306.   .| Glob. Var.: menu_pointer%,erg%,ml%,menu_adr%,m.enu1%,m.enu2%,m.enu3%
  13307.   .|     m.enu4%,m.enu5%,inf_ma$
  13308.   .| Felder    : frei%()
  13309.   .| Ruft auf  : clr_out,switch_menu,out,out_do,set_last,set_menu
  13310.   .| Aufruf in : lern_ende-1,infos-1,
  13311.   LOCAL a%,b%,kli%,a$,b$,c$,men%
  13312.   '
  13313.   men%=menu_pointer%
  13314.   erg%=3
  13315.   clr_out("Button-Text     Menü - Eintrag")
  13316.   ~MENU_TNORMAL(menu_pointer%,7,1)
  13317.   FOR kli%=1 TO 14
  13318.     ml%=frei%(kli%,0)
  13319.     '
  13320.     SELECT ml%
  13321.     CASE 1
  13322.       switch_menu(menu_adr%,m.enu1%)
  13323.     CASE 2
  13324.       switch_menu(menu_adr%,m.enu2%)
  13325.     CASE 3
  13326.       switch_menu(menu_adr%,m.enu3%)
  13327.     CASE 4
  13328.       switch_menu(menu_adr%,m.enu4%)
  13329.     CASE 5
  13330.       switch_menu(menu_adr%,m.enu5%)
  13331.     ENDSELECT
  13332.     '
  13333.     a%=frei%(kli%,2)
  13334.     b%=OB_SPEC(menu_pointer%,a%)
  13335.     IF b%>0
  13336.       a$=CHAR{OB_SPEC(menu_pointer%,a%)}
  13337.     ELSE
  13338.       a$=" "
  13339.     ENDIF
  13340.     a$=RIGHT$(STRING$(15,32)+a$,15)
  13341.     '
  13342.     a%=frei%(kli%,1)
  13343.     b%=OB_SPEC(menu_pointer%,a%)
  13344.     IF b%>0
  13345.       b$=CHAR{OB_SPEC(menu_pointer%,a%)}
  13346.     ELSE
  13347.       b$="  "
  13348.     ENDIF
  13349.     b$=LEFT$(b$+STRING$(30,32),30)
  13350.     c$=MID$(inf_ma$,kli%*5-4,5)
  13351.     out(" "+c$+a$+" "+b$)
  13352.   NEXT kli%
  13353.   out_do
  13354.   set_last(8)
  13355.   switch_menu(menu_adr%,men%)
  13356.   set_menu
  13357. RETURN
  13358. PROCEDURE last_8
  13359.   .| Glob. Var.: top%,txt_zeile%,kli%
  13360.   .| Ruft auf  : set_kleine_buttons
  13361.   .| Aufruf in : maus_pos-1,
  13362.   LOCAL a%
  13363.   a%=top%+txt_zeile%
  13364.   IF a%>0 AND a%<15
  13365.     kli%=a%
  13366.     set_kleine_buttons
  13367.   ENDIF
  13368. RETURN
  13369. '
  13370. PROCEDURE info_platten          ! PUNPTR Struktur ausgeben
  13371.   .| Glob. Var.: erg%,punptr%
  13372.   .| Ruft auf  : clr_out,out,dec_hex_val$,out_do
  13373.   .| Aufruf in : infos-1,
  13374.   LOCAL a%,i%,x%,y%
  13375.   erg%=3
  13376.   clr_out("Plattenzuordnung:")
  13377.   punptr%=LPEEK(&H516)
  13378.   IF punptr%>0
  13379.     a%=CARD{punptr%}
  13380.     out("Vom Treiber erkannte Festplatten: "+STR$(a%))
  13381.     out("")
  13382.     out("Laufwerk | Target | Startblock ")
  13383.     out("")
  13384.     FOR i%=0 TO 15
  13385.       x%=BYTE{punptr%+i%+2}
  13386.       y%={punptr%+2+16+(i%*4)}
  13387.       IF x%<>&HFF
  13388.         out("  "+CHR$(i%+65)+SPACE$(11)+STR$(x%)+SPACE$(6)+@dec_hex_val$(y%,8))
  13389.       ENDIF
  13390.     NEXT i%
  13391.   ENDIF
  13392.   out_do
  13393. RETURN
  13394. '
  13395. PROCEDURE show_status
  13396.   .| Glob. Var.: erg%,status%,top%
  13397.   .| Ruft auf  : clr_out,out,getistr$,out_do
  13398.   .| Aufruf in : stat_line-1,
  13399.   LOCAL i%
  13400.   erg%=3
  13401.   clr_out("STATUS CODE - Meldungen")
  13402.   FOR i%=0 TO 17
  13403.     out(RIGHT$("   "+STR$(-i%),3)+"  "+@getistr$(i%,1))
  13404.   NEXT i%
  13405.   IF ABS(status%)<18 AND erg%=3
  13406.     top%=ABS(status%)+1
  13407.   ENDIF
  13408.   out_do
  13409. RETURN
  13410. PROCEDURE sh_hd_err
  13411.   .| Glob. Var.: erg%,h_fehler%,hh_max%,top%,scsi_errmax%
  13412.   .| Felder    : scsi_err$()
  13413.   .| Ruft auf  : clr_out,out,dec_hex_val$,getistr$,out_do
  13414.   .| Aufruf in : stat_line-4,
  13415.   LOCAL i&
  13416.   erg%=3
  13417.   clr_out("Plattenfehler")
  13418.   IF h_fehler%>=0
  13419.     FOR i&=0 TO hh_max%-1
  13420.       out(@dec_hex_val$(i&,3)+"  "+@getistr$(i&,0))
  13421.     NEXT i&
  13422.     IF h_fehler%<hh_max% AND h_fehler%>=0
  13423.       top%=h_fehler%+1
  13424.     ENDIF
  13425.   ELSE
  13426.     FOR i&=1 TO scsi_errmax%-1
  13427.       out("-"+STR$(i&)+"  "+scsi_err$(i&))
  13428.     NEXT i&
  13429.   ENDIF
  13430.   out_do
  13431. RETURN
  13432. ' ----------------------- OUT/IN -----------------------
  13433. PROCEDURE out_logbuch
  13434.   .| Glob. Var.: erg%,logbuch$,fd$,log_dev%,device%,fhandle%
  13435.   .| Ruft auf  : dev,fclose
  13436.   .| Aufruf in : log_out-1,einstellungen-1,
  13437.   erg%=1
  13438.   dev("Logbuch anlegen",44)
  13439.   logbuch$=fd$
  13440.   log_dev%=device%
  13441.   IF device%<>99
  13442.     ~@fclose(fhandle%)
  13443.   ENDIF
  13444. RETURN
  13445. PROCEDURE in_help
  13446.   .| Glob. Var.: p_help$
  13447.   .| Ruft auf  : fsel$,init_help,set_help
  13448.   .| Aufruf in : opt_help-2,
  13449.   p_help$=@fsel$("*.HLP","","HELP-Datei laden",26)
  13450.   init_help
  13451.   set_help                      ! HELP-Dialog initialisieren
  13452. RETURN
  13453. PROCEDURE log_out
  13454.   .| Glob. Var.: log_dev%,logbuch$,fd$,device%,fhandle%,buf%,bps%
  13455.   .| Ruft auf  : alrt,out_logbuch,log_out,mtasse,chk_opn,fwrite2,fclose,mnorm
  13456.   .| Aufruf in : control-1,log_out-1,
  13457.   LOCAL wwa%
  13458.   '
  13459.   IF log_dev%<>99
  13460.     IF NOT (EXIST(logbuch$))
  13461.       wwa%=@alrt(2,"Logbuch ist noch nicht|aktiviert worden.",1,"Nochmal|Abbruch")
  13462.       IF wwa%=1
  13463.         out_logbuch
  13464.         log_out
  13465.       ENDIF
  13466.     ELSE
  13467.       mtasse
  13468.       chk_opn(fd$)
  13469.       IF device%<>99
  13470.         fwrite2(fhandle%,buf%,bps%)
  13471.         ~@fclose(fhandle%)
  13472.       ENDIF
  13473.     ENDIF
  13474.     mnorm
  13475.   ENDIF
  13476. RETURN
  13477. PROCEDURE floskel(a%)
  13478.   .| Glob. Var.: z%,tz%,buf%,ch%
  13479.   .| Felder    : flos$(),whdl&()
  13480.   .| Ruft auf  : mtasse,wind_top,do_list
  13481.   .| Aufruf in : cursor-1,last_9-1,
  13482.   LOCAL bc%,fu%,i%,fu$
  13483.   '
  13484.   fu$=flos$(1,a%-58)            ! Funktionsstring auswählen
  13485.   fu%=VAL(flos$(0,a%-58))       ! Länge
  13486.   bc%=z%+tz%
  13487.   IF fu%>0
  13488.     mtasse
  13489.     FOR i%=1 TO fu% STEP 2
  13490.       BYTE{buf%+bc%}=VAL("&h"+MID$(fu$,i%,2))
  13491.       INC bc%
  13492.     NEXT i%
  13493.     INC ch%
  13494.   ENDIF
  13495.   wind_top(whdl&(0))
  13496.   do_list
  13497. RETURN
  13498. PROCEDURE printer
  13499.   .| Glob. Var.: hdl%,device%
  13500.   .| Ruft auf  : alrt,fopen
  13501.   .| Aufruf in : dev-1,
  13502.   LOCAL prt%
  13503.   '
  13504.   prt%=1
  13505.   WHILE OUT?(0)=FALSE
  13506.     prt%=@alrt(2,"Drucker nicht bereit!",1,"Nochmal|Abbruch")
  13507.     EXIT IF prt%=2
  13508.   WEND
  13509.   IF prt%=1
  13510.     hdl%=@fopen("PRN:",1)
  13511.   ELSE
  13512.     device%=99
  13513.   ENDIF
  13514. RETURN
  13515. ' ---------------------- Device Handling ---------------
  13516. PROCEDURE dev(kommentar$,par%)
  13517.   .| Glob. Var.: device%,erg%,fd$,hdl%,fhandle%
  13518.   .| Ruft auf  : fsel$,alrt,chk_create,chk_opn,printer
  13519.   .| Aufruf in : hard_save-1,ram_save-1,disc_save-1,file_dump-1,datei_cut-2
  13520.   .|     datei_concat-1,sav_buf-2,sav_block-2,print_buf-1,print_blk-1
  13521.   .|     out_logbuch-1,save_block-1,do_save_text-1,fat_test-1,
  13522.   LOCAL a%,fex%,a$,erg2%
  13523.   CLR device%
  13524.   '
  13525.   SELECT erg%
  13526.   CASE 1
  13527.     fd$=@fsel$("*.*","",kommentar$,par%)
  13528.     IF LEN(fd$)>0
  13529.       IF EXIST(fd$)=TRUE       ! Datei existiert bereits
  13530.         a%=LEN(fd$)
  13531.         IF a%<22
  13532.           a$=SPACE$((22-a%)/2)+fd$+SPACE$((22-a%)/2)
  13533.         ELSE
  13534.           a$=RIGHT$(fd$,22)
  13535.         ENDIF
  13536.         erg2%=@alrt(2,a$+"|existiert bereits!",2,"Ersetzen|Anhängen|Abbruch")
  13537.         IF erg2%=1
  13538.           chk_create(fd$)       ! Überschreiben
  13539.         ELSE
  13540.           IF erg2%=2
  13541.             chk_opn(fd$)        ! Anhängen
  13542.             IF device%<>99
  13543.               hdl%=fhandle%
  13544.             ENDIF
  13545.           ELSE
  13546.             device%=99          ! Abbruch nach EXIST
  13547.           ENDIF
  13548.         ENDIF
  13549.         '
  13550.       ELSE
  13551.         IF RIGHT$(fd$)<>"\"     ! Datei existiert noch nicht
  13552.           chk_create(fd$)       ! Normal anlegen
  13553.         ELSE
  13554.           device%=99
  13555.         ENDIF
  13556.       ENDIF
  13557.     ELSE
  13558.       device%=99                ! kein Name
  13559.     ENDIF
  13560.   CASE 2
  13561.     @printer
  13562.   CASE 3,4
  13563.     device%=99
  13564.   ENDSELECT
  13565. RETURN
  13566. PROCEDURE chk_create(chk$)
  13567.   .| Glob. Var.: hdl%,device%
  13568.   .| Ruft auf  : fcreate
  13569.   .| Aufruf in : dev-2,
  13570.   hdl%=@fcreate(chk$,0)         ! Datei immer mit Fcreate öffnen
  13571.   IF hdl%<0
  13572.     device%=99                  ! Write-Protekt - Abbruch
  13573.   ENDIF
  13574. RETURN
  13575. PROCEDURE chk_opn(chk$)
  13576.   .| Glob. Var.: fhandle%,pfad$,dum$,device%
  13577.   .| Ruft auf  : fcreate,fclose,fdelete,fopen,fseek
  13578.   .| Aufruf in : log_out-1,dev-1,
  13579.   fhandle%=@fcreate(pfad$+dum$,0)       ! Dummy-Datei erzeugen - Schreibschutz?
  13580.   IF fhandle%>0
  13581.     ~@fclose(fhandle%)          ! kein Schreibschutz, Dummy schließen
  13582.     ~@fdelete(pfad$+dum$)       ! und Dummy wieder löschen
  13583.     fhandle%=@fopen(chk$,2)     ! jetzt Datei öffnen
  13584.     IF fhandle%>=0
  13585.       ~@fseek(0,fhandle%,2)     ! Pointer ans Ende der Datei
  13586.     ELSE
  13587.       device%=99
  13588.     ENDIF
  13589.   ELSE
  13590.     device%=99                  ! Write Protekt
  13591.   ENDIF
  13592. RETURN
  13593. ' ---------------------- Option / HELP -----------------
  13594. PROCEDURE opt_konfig          ! Voreinstellungen
  13595.   .| Glob. Var.: v.oreinst%,feedcode&,f.eedcode%,konfigab&,old_cpos%
  13596.   .| Ruft auf  : set_rsc,put_char,box_draw,form_do,box_undraw,clr_state
  13597.   .|     check_vor,do_list
  13598.   .| Aufruf in : einstellungen-1,
  13599.   LOCAL ex_obj&
  13600.   set_rsc
  13601.   put_char(v.oreinst%,feedcode&,HEX$(f.eedcode%,2))
  13602.   box_draw(v.oreinst%)
  13603.   ex_obj&=@form_do(v.oreinst%) AND &HFF
  13604.   box_undraw(v.oreinst%)
  13605.   clr_state(v.oreinst%,ex_obj&,1)
  13606.   IF ex_obj&<>konfigab&
  13607.     check_vor
  13608.     DEC old_cpos%
  13609.     do_list
  13610.   ENDIF
  13611. RETURN
  13612. PROCEDURE einstellungen
  13613.   .| Glob. Var.: ein.stell%
  13614.   .| Ruft auf  : box_draw,form_do,box_undraw,clr_state,out_logbuch
  13615.   .|     set_dma_mask,opt_konfig,setfont,dum,save_einstellungen
  13616.   .| Aufruf in : menu_mess-1,
  13617.   LOCAL ex_obj&
  13618.   box_draw(ein.stell%)
  13619.   ex_obj&=@form_do(ein.stell%) AND &HFF
  13620.   box_undraw(ein.stell%)
  13621.   clr_state(ein.stell%,ex_obj&,1)
  13622.   ON ex_obj& GOSUB out_logbuch,set_dma_mask,opt_konfig,setfont,dum,save_einstellungen
  13623. RETURN
  13624. PROCEDURE opt_help            ! HELP aufgerufen
  13625.   .| Glob. Var.: help_mem%,h.elp%,hlp_load&,help1&,help15&,helpabb&
  13626.   .| Ruft auf  : alrt,in_help,opt_help,box_draw,form_do,box_undraw,clr_state
  13627.   .|     clr_flags,set_flags,help
  13628.   .| Aufruf in : haupt_dialog-1,control-1,cursor-1,about_me-1,opt_help-2,
  13629.   LOCAL ex_obj&,i&,wwa%
  13630.   '
  13631.   IF help_mem%=0
  13632.     wwa%=@alrt(2,"Keine HELP-Datei geladen",1,"Laden|Abbruch")
  13633.     IF wwa%=1
  13634.       in_help
  13635.       opt_help
  13636.     ENDIF
  13637.   ELSE
  13638.     box_draw(h.elp%)
  13639.     ex_obj&=@form_do(h.elp%) AND &HFF
  13640.     box_undraw(h.elp%)
  13641.     clr_state(h.elp%,ex_obj&,1)         ! selected?
  13642.     '
  13643.     IF ex_obj&=hlp_load&
  13644.       in_help
  13645.       opt_help
  13646.     ELSE
  13647.       FOR i&=help1& TO help15&
  13648.         clr_flags(h.elp%,i&,2)            ! CLR default
  13649.       NEXT i&
  13650.       clr_flags(h.elp%,helpabb&,2)        ! Default alt löschen
  13651.       '
  13652.       set_flags(h.elp%,ex_obj&,2)         ! und neu setzen
  13653.       IF ex_obj&<=help15&
  13654.         help(ex_obj&)
  13655.       ENDIF
  13656.     ENDIF
  13657.   ENDIF
  13658. RETURN
  13659. PROCEDURE help(was%)          ! HELP-Dialog Button ausführen
  13660.   .| Glob. Var.: erg%,hlp_str$,help1&,help_size%,help_mem%,ab%
  13661.   .| Ruft auf  : clr_out,out,get_line$,out_do
  13662.   .| Aufruf in : opt_help-1,
  13663.   LOCAL i%,j%,a$,b$,buf$
  13664.   erg%=3
  13665.   CLR i%
  13666.   clr_out(hlp_str$)
  13667.   out("")
  13668.   j%=was%-help1&+1
  13669.   '
  13670.   buf$=STRING$(help_size%,0)
  13671.   BMOVE help_mem%,V:buf$,LEN(buf$)
  13672.   ab%=1
  13673.   WHILE ab%<=LEN(buf$)
  13674.     a$=@get_line$(ab%)
  13675.     IF ASC(a$)=45       ! "-xxxx" suchen
  13676.       INC i%
  13677.     ENDIF
  13678.     IF i%=j%            ! gesuchten Zeilen gefunden?
  13679.       out(a$)           ! ja,
  13680.     ENDIF
  13681.     EXIT IF i%>j%
  13682.   WEND
  13683.   CLR buf$
  13684.   out_do
  13685. RETURN
  13686. PROCEDURE check_vor
  13687.   .| Glob. Var.: f.eed%,v.oreinst%,feed&,s.lider%,slider&,f.eedcode%,feedcode&
  13688.   .|     dial.pos%,dial2pos&,s.ammeln%,sammeln&,t.xtsavm%,txtsavm&,sperr_txt%
  13689.   .|     sperrtxt&,dechex&,dec%,cursor_rate%,vorcurrt&,tabs%,tabanz&,max.text%
  13690.   .|     maxtext&
  13691.   .| Ruft auf  : get_char$,get_val,set_vdipar
  13692.   .| Aufruf in : rsc_init-1,opt_konfig-1,
  13693.   f.eed%=(OB_STATE(v.oreinst%,feed&) AND 2)
  13694.   s.lider%=(OB_STATE(v.oreinst%,slider&) AND 2)
  13695.   f.eedcode%=VAL("&H"+@get_char$(v.oreinst%,feedcode&))
  13696.   dial.pos%=(OB_STATE(v.oreinst%,dial2pos&) AND 2)
  13697.   s.ammeln%=(OB_STATE(v.oreinst%,sammeln&) AND 2)
  13698.   t.xtsavm%=(OB_STATE(v.oreinst%,txtsavm&) AND 2)
  13699.   sperr_txt%=(OB_STATE(v.oreinst%,sperrtxt&) AND 2)
  13700.   '
  13701.   IF (OB_STATE(v.oreinst%,dechex&) AND 2)>0
  13702.     dec%=1
  13703.   ELSE
  13704.     dec%=0
  13705.   ENDIF
  13706.   cursor_rate%=@get_val(v.oreinst%,vorcurrt&)
  13707.   tabs%=@get_val(v.oreinst%,tabanz&)
  13708.   max.text%=@get_val(v.oreinst%,maxtext&)
  13709.   set_vdipar
  13710. RETURN
  13711. PROCEDURE opt_text            ! Textfenster ausgeben/löschen
  13712.   .| Glob. Var.: wa$,erg%,wind%,whdl&,wx&,wy&,wb&,wh&
  13713.   .| Felder    : whdl&()
  13714.   .| Ruft auf  : alrt,do_clr_out,out_do,wind_top,redraw_list
  13715.   .| Aufruf in : menu_mess-1,
  13716.   IF @alrt(2,"Textfenster löschen? ",1,wa$)=1
  13717.     erg%=3
  13718.     do_clr_out("")
  13719.     IF wind%=1
  13720.       out_do
  13721.     ELSE
  13722.       wind_top(whdl&(1))
  13723.       whdl&=whdl&(1)
  13724.       ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&)
  13725.       redraw_list(whdl&,wx&,wy&,wb&,wh&,1)
  13726.     ENDIF
  13727.   ENDIF
  13728. RETURN
  13729. PROCEDURE opt_ascii           ! ASCII-Datei in Window 2 laden
  13730.   .| Glob. Var.: fi$
  13731.   .| Felder    : pfad$()
  13732.   .| Ruft auf  : fsel$,do_ascii,ctrl_h
  13733.   .| Aufruf in : stat_line-1,dat_lesen-1,
  13734.   fi$=@fsel$("*.*","","ASCII-Datei laden",29)
  13735.   do_ascii(fi$)
  13736.   ctrl_h
  13737.   pfad$(46)=pfad$(29)           ! fürs Speichern des Textes (Hi Claus ...)
  13738. RETURN
  13739. PROCEDURE opt_fehler          ! Fehlerseite ausgeben oder löschen
  13740.   .| Glob. Var.: fer%,flist%
  13741.   .| Ruft auf  : alrt,show_err_inf,err_clr
  13742.   .| Aufruf in : menu_mess-1,
  13743.   IF fer%>0
  13744.     flist%=@alrt(2,"Fehlerseite ... ",flist%,"Ausgeben|Löschen|Abbruch")
  13745.     ON flist% GOSUB show_err_inf,err_clr
  13746.   ELSE
  13747.     ~@alrt(3,"Kein Fehler, keine Nachrichten.",1,"Gut so")
  13748.   ENDIF
  13749. RETURN
  13750. '
  13751. PROCEDURE save_text           ! Textfenster sichern
  13752.   .| Ruft auf  : do_save_text
  13753.   .| Aufruf in : dat_sichern-1,dat_sichern_als-1,
  13754.   do_save_text
  13755. RETURN
  13756. PROCEDURE save_block          ! Teil des Textfensters sichern
  13757.   .| Glob. Var.: device%
  13758.   .| Ruft auf  : dev,text_dev
  13759.   .| Aufruf in : dat_sichern_als-1,print_block-1,
  13760.   dev("Block sichern",45)
  13761.   IF device%<>99
  13762.     text_dev
  13763.   ENDIF
  13764. RETURN
  13765. PROCEDURE print_text          ! Textfenster drucken
  13766.   .| Ruft auf  : do_save_text
  13767.   .| Aufruf in : dat_drucken-1,
  13768.   do_save_text
  13769. RETURN
  13770. PROCEDURE print_block         ! Block aus Textfenster drucken
  13771.   .| Ruft auf  : save_block
  13772.   .| Aufruf in : dat_drucken-1,
  13773.   @save_block
  13774. RETURN
  13775. PROCEDURE do_save_text        ! ganzes Textfenster auf Datei/Drucker ausgeben
  13776.   .| Glob. Var.: device%,ch2%
  13777.   .| Ruft auf  : dev,out_do
  13778.   .| Aufruf in : save_text-1,print_text-1,
  13779.   dev("Textfenster sichern",46)
  13780.   IF device%<>99
  13781.     out_do
  13782.     CLR ch2%
  13783.   ENDIF
  13784. RETURN
  13785. PROCEDURE text_dev            ! Textblock auf Drucker/Datei ausgeben
  13786.   .| Glob. Var.: hdl%,ver$,tblkaz%,tblkez%,tblkas%,tblkes%
  13787.   .| Felder    : out$()
  13788.   .| Ruft auf  : fwritec,look_ex
  13789.   .| Aufruf in : save_block-1,
  13790.   LOCAL i%
  13791.   '
  13792.   fwritec(hdl%,ver$+":   "+DATE$+"   "+TIME$)
  13793.   i%=tblkaz%
  13794.   IF tblkaz%=tblkez%
  13795.     fwritec(hdl%,MID$(out$(i%),tblkas%,tblkes%-tblkas%+1))
  13796.   ELSE
  13797.     IF LEN(out$(i%))
  13798.       fwritec(hdl%,RIGHT$(out$(i%),LEN(out$(i%))-tblkas%+1))
  13799.     ENDIF
  13800.   ENDIF
  13801.   INC i%
  13802.   WHILE i%<tblkez%
  13803.     fwritec(hdl%,out$(i%))
  13804.     INC i%
  13805.   WEND
  13806.   IF tblkaz%<>tblkez%
  13807.     fwritec(hdl%,LEFT$(out$(i%),tblkes%))
  13808.   ENDIF
  13809.   look_ex
  13810. RETURN
  13811. '
  13812. PROCEDURE show_err_inf
  13813.   .| Glob. Var.: erg%,i%,fer%,top%,wz%
  13814.   .| Felder    : err_fld$()
  13815.   .| Ruft auf  : clr_out,out,out_do
  13816.   .| Aufruf in : hard_statistik-1,opt_fehler-1,
  13817.   erg%=3
  13818.   clr_out("Fehler und Nachrichten:")
  13819.   FOR i%=1 TO fer%
  13820.     out(err_fld$(i%))
  13821.   NEXT i%
  13822.   IF erg%=3
  13823.     top%=MAX(0,fer%-wz%+1)
  13824.   ENDIF
  13825.   out_do
  13826. RETURN
  13827. PROCEDURE err_clr
  13828.   .| Glob. Var.: max_err%,fer%
  13829.   .| Aufruf in : opt_fehler-1,err_max-1,
  13830.   ERASE err_fld$()
  13831.   DIM err_fld$(max_err%)
  13832.   CLR fer%
  13833. RETURN
  13834. PROCEDURE set_dma_mask
  13835.   .| Glob. Var.: targ.mask%,tmaskok&,acsiall&,acsino&,scsiall&,scsino&
  13836.   .|     tghdtyp&,tmask1&,tmask8&,hard%,target%
  13837.   .| Felder    : hd_typ%(),hd_typ$(),dma%()
  13838.   .| Ruft auf  : box_draw,form_do,set_targ,put_char,objc_update,clr_state
  13839.   .|     box_undraw,set_hard
  13840.   .| Aufruf in : einstellungen-1,
  13841.   LOCAL a%,i&,j&,ex_obj&
  13842.   '
  13843.   box_draw(targ.mask%)
  13844.   DO
  13845.     ex_obj&=@form_do(targ.mask%) AND &HFF
  13846.     EXIT IF ex_obj&=tmaskok&
  13847.     '
  13848.     SELECT ex_obj&
  13849.     CASE acsiall&
  13850.       set_targ(0,1)
  13851.     CASE acsino&
  13852.       set_targ(0,0)
  13853.     CASE scsiall&
  13854.       set_targ(16,1)
  13855.     CASE scsino&
  13856.       set_targ(16,0)
  13857.     ENDSELECT
  13858.     '
  13859.     IF ex_obj&>=tghdtyp& AND ex_obj&<=tghdtyp&+7
  13860.       a%=ex_obj&-tghdtyp&
  13861.       IF hd_typ%(a%)=4
  13862.         hd_typ%(a%)=1
  13863.       ELSE
  13864.         INC hd_typ%(a%)
  13865.       ENDIF
  13866.       put_char(targ.mask%,ex_obj&,hd_typ$(hd_typ%(a%)))
  13867.       objc_update(targ.mask%,ex_obj&)
  13868.     ENDIF
  13869.   LOOP
  13870.   clr_state(targ.mask%,ex_obj&,1)
  13871.   box_undraw(targ.mask%)
  13872.   IF ex_obj&=tmaskok&
  13873.     FOR i&=0 TO 15
  13874.       IF (OB_STATE(targ.mask%,tmask1&+i&) AND 2)>0
  13875.         dma%(i&)=1
  13876.       ELSE
  13877.         dma%(i&)=0
  13878.       ENDIF
  13879.     NEXT i&
  13880.     FOR i&=16 TO 31
  13881.       IF (OB_STATE(targ.mask%,tmask8&+i&-16) AND 2)>0
  13882.         dma%(i&)=1
  13883.       ELSE
  13884.         dma%(i&)=0
  13885.       ENDIF
  13886.     NEXT i&
  13887.   ENDIF
  13888.   hard%=@set_hard(target%)
  13889. RETURN
  13890. PROCEDURE set_targ(witch%,a%)
  13891.   .| Glob. Var.: tmask1&,tmask8&,targ.mask%
  13892.   .| Felder    : dma%()
  13893.   .| Ruft auf  : cross_rsc,objc_update
  13894.   .| Aufruf in : set_dma_mask-4,
  13895.   LOCAL i&,j&
  13896.   '
  13897.   FOR i&=witch% TO witch%+15
  13898.     IF i&<16
  13899.       j&=tmask1&+i&
  13900.     ELSE
  13901.       j&=tmask8&+i&-16
  13902.     ENDIF
  13903.     dma%(i&)=a%
  13904.     cross_rsc(targ.mask%,j&,dma%(i&))
  13905.     objc_update(targ.mask%,j&)
  13906.   NEXT i&
  13907. RETURN
  13908. PROCEDURE do_ascii(fi$)
  13909.   .| Glob. Var.: ch2%,fhandle%,erg%,out%,max.text%
  13910.   .| Felder    : out$()
  13911.   .| Ruft auf  : fopen,fseek,fread2,fclose,clr_out,out,check_tab$,out_do
  13912.   .| Aufruf in : opt_ascii-1,
  13913.   LOCAL a%,b%,c%,i%,in_ascii%,a$,b$,c$
  13914.   '
  13915.   IF EXIST(fi$)=TRUE
  13916.     CLR ch2%
  13917.     REPEAT
  13918.       fhandle%=@fopen(fi$,0)            ! Datei öffnen
  13919.       EXIT IF fhandle%<6                ! Problem?
  13920.       a%=@fseek(0,fhandle%,2)           ! nein, Länge feststellen
  13921.       in_ascii%=MALLOC(a%)              ! Speicher holen
  13922.       EXIT IF in_ascii%=0               ! Kein Speicher?
  13923.       ~@fseek(0,fhandle%,0)             ! doch, wieder von vorn lesen
  13924.       fread2(fhandle%,in_ascii%,a%)     ! komplett einlesen
  13925.       EXIT IF fhandle%<6                !
  13926.       ~@fclose(fhandle%)                ! und Datei schliessen
  13927.       '
  13928.       b%=in_ascii%                      ! Pufferanfang
  13929.       c%=b%+a%                          ! Pufferende
  13930.       clr_out("")
  13931.       erg%=3                            ! Ausgabe auf Bildschirm
  13932.       b$=STRING$(512,0)                 ! Puffer
  13933.       '
  13934.       WHILE b%<c%       ! schon am Ende?
  13935.         BMOVE b%,V:b$,LEN(b$)
  13936.         a%=INSTR(1,b$,CHR$(10))
  13937.         IF a%<2
  13938.           a%=MIN(LEN(b$)+2,c%-b%+2)
  13939.         ENDIF
  13940.         a$=STRING$(a%-2,0)
  13941.         BMOVE b%,V:a$,LEN(a$)
  13942.         out(@check_tab$(a$))
  13943.         EXIT IF out%>=max.text%
  13944.         IF a%=LEN(b$)+2
  13945.           SUB a%,2
  13946.         ENDIF
  13947.         ADD b%,a%
  13948.       WEND
  13949.       ~MFREE(in_ascii%)
  13950.       out$(0)=fi$
  13951.       out_do
  13952.     UNTIL 1
  13953.   ENDIF
  13954. RETURN
  13955. FUNCTION check_tab$(a$)
  13956.   .| Glob. Var.: tabs%
  13957.   .| Aufruf in : alt_t-1,do_ascii-1,
  13958.   LOCAL i%
  13959.   i%=INSTR(a$,CHR$(9))
  13960.   WHILE i%
  13961.     a$=LEFT$(a$,i%-1)+SPACE$(tabs%)+RIGHT$(a$,LEN(a$)-i%)
  13962.     i%=INSTR(a$,CHR$(9))
  13963.   WEND
  13964.   RETURN a$
  13965. ENDFUNC
  13966. ' ---------------------- Fehler speichern --------------
  13967. PROCEDURE err_inf(fehler%)
  13968.   .| Glob. Var.: fer%,max_err%,lgs%,drive%
  13969.   .| Felder    : err_fld$()
  13970.   .| Ruft auf  : getistr$,err_max
  13971.   .| Aufruf in : lesen-1,schreiben-3,disc_info-2,boot_sec-2,disc_clear-1
  13972.   .|     disc_check_err-1,last_5-1,dir_fldren-2,search_lesen-1,write_fat-1
  13973.   .|     bios_block-1,o_neu-2,
  13974.   LOCAL a$
  13975.   IF fehler%<>0
  13976.     IF fer%<max_err%
  13977.       INC fer%
  13978.       a$=STR$(lgs%)
  13979.       IF ABS(fehler%)>20
  13980.         fehler%=1
  13981.       ENDIF
  13982.       err_fld$(fer%)=CHR$(drive%+65)+": LGS "+a$+" "+@getistr$(ABS(fehler%),1)
  13983.     ELSE
  13984.       err_fld$(max_err%)="Fehler-Überlauf"
  13985.       fer%=max_err%
  13986.       err_max
  13987.     ENDIF
  13988.   ENDIF
  13989. RETURN
  13990. PROCEDURE err_inf1(fehler%,txt$,txt2$)
  13991.   .| Glob. Var.: wa$,status%
  13992.   .| Ruft auf  : err_inf3,alrt
  13993.   .| Aufruf in : dsetdrv-1,dsetpath-1,frename-1,fdatime-1,fattrib-1,fcreate-1
  13994.   .|     fopen-1,fseek-1,fclose-1,fdelete-1,freadf-2,fwritef-1,fwrite2-1,
  13995.   LOCAL erg2%
  13996.   err_inf3(fehler%,txt$,txt2$)
  13997.   erg2%=@alrt(3,txt$+"|"+txt2$+" "+STR$(fehler%),1,wa$)
  13998.   IF fehler%>0 AND erg2%=2
  13999.     status%=-1
  14000.   ENDIF
  14001. RETURN
  14002. PROCEDURE err_inf3(fehler%,txt$,txt2$)
  14003.   .| Glob. Var.: fer%,max_err%,abb%
  14004.   .| Felder    : err_fld$()
  14005.   .| Ruft auf  : err_max
  14006.   .| Aufruf in : frename-1,err_inf1-1,fat_test-2,fat_check-3,fat_check_do-1
  14007.   .|     fat_xor-1,
  14008.   IF fer%<max_err%
  14009.     INC fer%
  14010.     err_fld$(fer%)=txt$+" "+txt2$+" "+STR$(fehler%)
  14011.   ELSE
  14012.     err_fld$(max_err%)="Fehler-Überlauf"
  14013.     fer%=max_err%
  14014.     err_max
  14015.     abb%=1
  14016.   ENDIF
  14017. RETURN
  14018. PROCEDURE err_max
  14019.   .| Glob. Var.: fer%,max_err%
  14020.   .| Ruft auf  : alrt,err_clr
  14021.   .| Aufruf in : hard_err-1,err_inf-1,err_inf3-1,
  14022.   LOCAL erg2%
  14023.   IF fer%>=max_err%-5
  14024.     erg2%=@alrt(3,"Fehlerseite ist voll.",1,"Danke|Löschen")
  14025.     IF erg2%=2
  14026.       err_clr
  14027.     ENDIF
  14028.   ENDIF
  14029. RETURN
  14030. ' ---------------------- FAT-Routinen ------------------
  14031. PROCEDURE fat_bearbeiten        ! FAT-Einträge bearbeiten
  14032.   .| Glob. Var.: cluster%,cpd%,f.at%,fat_nr&,fwrt&,fatabb&,fatplus&,fatmin&
  14033.   .|     fatwrite&,wa$,drive%,fatm1&,fatm2&,ed%,fatm3&
  14034.   .| Ruft auf  : change,put_char,dec_hex_val$,read_in_fat,box_draw,form_do
  14035.   .|     clr_state,objc_update,term$,write_in_fat,alrt,write_fat,bios_block
  14036.   .|     box_undraw,set_cursor_in_fat
  14037.   .| Aufruf in : menu_mess-1,
  14038.   LOCAL aa%,ab%,ex_obj&,a$
  14039.   '
  14040.   change
  14041.   cluster%=MIN(cluster%,cpd%+1)
  14042.   put_char(f.at%,fat_nr&,@dec_hex_val$(cluster%,6))
  14043.   aa%=@read_in_fat(cluster%)
  14044.   put_char(f.at%,fwrt&,@dec_hex_val$(aa%,6))
  14045.   box_draw(f.at%)
  14046.   DO
  14047.     ex_obj&=@form_do(f.at%)
  14048.     ab%=ex_obj& DIV 256
  14049.     ex_obj&=ex_obj& AND &HFF
  14050.     clr_state(f.at%,ex_obj&,1)
  14051.     objc_update(f.at%,ex_obj&)
  14052.     objc_update(f.at%,fwrt&)
  14053.     EXIT IF ex_obj&=fatabb&
  14054.     SELECT ex_obj&
  14055.     CASE fat_nr&
  14056.       IF ab%>0
  14057.         a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}}
  14058.         cluster%=MIN(cpd%+1,VAL(a$))
  14059.         aa%=@read_in_fat(cluster%)
  14060.         put_char(f.at%,fat_nr&,@dec_hex_val$(aa%,6))
  14061.         cluster%=aa%
  14062.         aa%=@read_in_fat(cluster%)
  14063.       ELSE
  14064.         a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}}
  14065.         cluster%=MIN(cpd%+1,VAL(a$))
  14066.         aa%=@read_in_fat(cluster%)
  14067.       ENDIF
  14068.     CASE fatplus&
  14069.       IF ab%>0
  14070.         cluster%=cpd%+1
  14071.       ELSE
  14072.         cluster%=MIN(VAL(CHAR{{OB_SPEC(f.at%,fat_nr&)}})+1,cpd%+1)
  14073.       ENDIF
  14074.       aa%=@read_in_fat(cluster%)
  14075.     CASE fatmin&
  14076.       IF ab%>0
  14077.         cluster%=2
  14078.       ELSE
  14079.         cluster%=MAX(2,VAL(CHAR{{OB_SPEC(f.at%,fat_nr&)}})-1)
  14080.       ENDIF
  14081.       aa%=@read_in_fat(cluster%)
  14082.     CASE fatwrite&
  14083.       a$=CHAR{{OB_SPEC(f.at%,fwrt&)}}
  14084.       write_in_fat(VAL(a$),cluster%)
  14085.       IF @alrt(2,"FAT zurückschreiben?",0,wa$)=1
  14086.         write_fat
  14087.       ELSE
  14088.         bios_block(drive%)
  14089.       ENDIF
  14090.       aa%=@read_in_fat(cluster%)
  14091.     CASE fatm1&
  14092.       a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}}
  14093.       cluster%=MIN(cpd%+1,VAL(a$))
  14094.       aa%=0
  14095.       write_in_fat(aa%,cluster%)
  14096.     CASE fatm2&
  14097.       a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}}
  14098.       cluster%=MIN(cpd%+1,VAL(a$))
  14099.       aa%=ed%-8
  14100.       write_in_fat(aa%,cluster%)
  14101.     CASE fatm3&
  14102.       a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}}
  14103.       cluster%=MIN(cpd%+1,VAL(a$))
  14104.       aa%=ed%
  14105.       write_in_fat(aa%,cluster%)
  14106.     ENDSELECT
  14107.     put_char(f.at%,fwrt&,@dec_hex_val$(aa%,6))
  14108.     objc_update(f.at%,fwrt&)
  14109.     put_char(f.at%,fat_nr&,@dec_hex_val$(cluster%,6))
  14110.     objc_update(f.at%,fat_nr&)
  14111.   LOOP
  14112.   box_undraw(f.at%)
  14113.   bios_block(drive%)
  14114.   a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}}
  14115.   set_cursor_in_fat(MAX(0,VAL(a$)))
  14116.   '
  14117. RETURN
  14118. PROCEDURE fat_cluster           ! Cluster von Datei/Ordner anzeigen
  14119.   .| Glob. Var.: drive%,fi$,pfad$,lgs%,anf_fat2%,len_fat%,len_dir%,total%,erg%
  14120.   .|     ed%,cpd%
  14121.   .| Felder    : file$(),cluster%()
  14122.   .| Ruft auf  : change_pfad,fsel$,chk_drv,alrt,find_files,clr_out,read_in_fat
  14123.   .|     dec_hex_val$,out,out_do
  14124.   .| Aufruf in : menu_mess-1,
  14125.   LOCAL a$,fac$,cl%,j%,anz%
  14126.   '
  14127.   change_pfad(30,drive%)
  14128.   fi$=@fsel$("*.*","","Datei auswählen",30)
  14129.   IF LEN(fi$)>0
  14130.     ~@chk_drv(fi$)
  14131.     '
  14132.     IF RIGHT$(fi$)="\"
  14133.       fac$=LEFT$(fi$,LEN(fi$)-1)
  14134.     ELSE
  14135.       a$=RIGHT$(pfad$,LEN(pfad$)-INSTR(pfad$,"\"))
  14136.       fac$=fi$                        ! Datei
  14137.     ENDIF
  14138.     IF MID$(fac$,3,1)="\" AND LEN(fi$)=3
  14139.       lgs%=anf_fat2%+len_fat%
  14140.       ~@alrt(1,"Wurzelverzeichnis ab Sektor "+STR$(lgs%)+" |für "+STR$(len_dir%)+" Sektoren.",1," Aha ")
  14141.       j%=total%+1
  14142.     ENDIF
  14143.     '
  14144.     IF LEN(fac$)>3
  14145.       find_files
  14146.       CLR j%
  14147.       REPEAT
  14148.         EXIT IF fac$=file$(j%)
  14149.         INC j%
  14150.       UNTIL j%>total%
  14151.       '
  14152.       erg%=3
  14153.       clr_out("Cluster von: "+fi$)
  14154.       cl%=cluster%(j%)
  14155.       '
  14156.       IF j%<=total%
  14157.         CLR anz%
  14158.         ' DO
  14159.         REPEAT
  14160.           CLR a$
  14161.           WHILE LEN(a$)<70
  14162.             INC anz%
  14163.             a$=a$+@dec_hex_val$(cl%,7)+" "
  14164.             cl%=@read_in_fat(cl%)
  14165.             EXIT IF cl%<2 OR cl%>=cpd%+2
  14166.           WEND
  14167.           out(a$)
  14168.           IF cl%<2 OR (cl%>=cpd%+2 AND cl%<ed%-7)
  14169.             out("Ungültiger Cluster-Eintrag "+@dec_hex_val$(cl%,7))
  14170.           ENDIF
  14171.         UNTIL cl%<2 OR cl%>=cpd%+2
  14172.         out(STR$(anz%)+" Cluster")
  14173.       ENDIF
  14174.       out_do
  14175.     ENDIF
  14176.   ENDIF
  14177. RETURN
  14178. PROCEDURE fat_test              ! FAT testen auf Leichencluster
  14179.   .| Glob. Var.: device%,erg%,fd$,drive%,status%,ed%,cpd%,aa%,lgs%,spc%
  14180.   .|     anf_dat%,hdl%,buf%,bps%
  14181.   .| Felder    : fat%()
  14182.   .| Ruft auf  : alrt,dev,fat_check,read_in_fat,err_inf3,write_in_fat
  14183.   .|     fat_get_leiche,fclose,write_fat,bios_block,lesen,fwrite2
  14184.   .| Aufruf in : menu_mess-1,
  14185.   LOCAL cc%,fterg%,fat_tst%,fu%
  14186.   '
  14187.   fterg%=@alrt(2,"Was tun, falls herrenlose|Cluster herumliegen|sollten?",1,"Sammeln|Nichts|Abbruch")
  14188.   CLR device%,fu%
  14189.   IF fterg%<3
  14190.     IF fterg%=1
  14191.       erg%=1
  14192.       dev("Leichencluster sammeln",47)
  14193.     ENDIF
  14194.     IF device%<>99
  14195.       IF ASC(fd$)-65=drive%
  14196.         ~@alrt(3,"Sammeln unbedingt auf einem|anderen Laufwerk!",1," Ok ")
  14197.       ELSE
  14198.         CLR status%
  14199.         fat_check
  14200.         IF status%=0
  14201.           cc%=ed%-8
  14202.           FOR fat_tst%=2 TO cpd%+1
  14203.             aa%=@read_in_fat(fat_tst%)
  14204.             IF aa% AND fat%(fat_tst%)=0
  14205.               IF aa%=cc%
  14206.                 err_inf3(fat_tst%,"Cluster defekt","Clusternummer=")
  14207.               ELSE
  14208.                 err_inf3(fat_tst%,"Clusterleiche","Clusternummer=")
  14209.                 INC fu%
  14210.                 write_in_fat(0,fat_tst%)
  14211.                 IF fterg%=1
  14212.                   lgs%=(fat_tst%-2)*spc%+anf_dat%
  14213.                   FOR lgs%=lgs% TO lgs%+spc%-1
  14214.                     lesen
  14215.                     fwrite2(hdl%,buf%,bps%)
  14216.                   NEXT lgs%
  14217.                 ENDIF
  14218.               ENDIF
  14219.             ENDIF
  14220.           NEXT fat_tst%
  14221.           IF fu%>0
  14222.             IF @alrt(2,STR$(fu%)+" Leichencluster gefunden.|Sollen diese Cluster|freigegeben werden?",0,"Ja| Nein ")=1
  14223.               write_fat
  14224.             ELSE
  14225.               bios_block(drive%)
  14226.             ENDIF
  14227.           ENDIF
  14228.         ENDIF
  14229.         ERASE fat%()
  14230.       ENDIF
  14231.       IF fterg%=1
  14232.         ~@fclose(hdl%)
  14233.       ENDIF
  14234.     ENDIF
  14235.   ENDIF
  14236. RETURN
  14237. PROCEDURE fat_check             ! FAT testen und in Feld FAT%() eintragen
  14238.   .| Glob. Var.: abb%,status%,cpd%,ed%,fat_tst%,total%,fer%,max_err%,f$,bps%
  14239.   .|     spc%
  14240.   .| Felder    : att%(),cluster%(),laenge%(),file$()
  14241.   .| Ruft auf  : find_files,mtasse,fat_check_do,read_in_fat,err_inf3,was_ist
  14242.   .|     mnorm
  14243.   .| Aufruf in : fat_test-1,fat_graph-1,
  14244.   LOCAL i%,cl%,aa%,cc%,ex%,akt_cl%
  14245.   '
  14246.   find_files
  14247.   IF abb%=0
  14248.     mtasse
  14249.     CLR status%
  14250.     IF DIM?(fat%())
  14251.       ERASE fat%()
  14252.     ENDIF
  14253.     DIM fat%(cpd%+2)
  14254.     cc%=ed%-8
  14255.     '
  14256.     FOR fat_tst%=1 TO total%
  14257.       '
  14258.       IF (att%(fat_tst%) AND 8)=0
  14259.         cl%=cluster%(fat_tst%)
  14260.         IF cl%>=2 AND cl%<cpd%+2
  14261.           akt_cl%=1
  14262.           IF fat%(cl%)
  14263.             ~@fat_check_do
  14264.           ELSE
  14265.             fat%(cl%)=fat_tst%
  14266.           ENDIF
  14267.           IF laenge%(fat_tst%) OR (att%(fat_tst%) AND &H10)     ! Ordner
  14268.             CLR ex%
  14269.             DO
  14270.               aa%=@read_in_fat(cl%)
  14271.               EXIT IF aa%<2 OR aa%>=cpd%+2
  14272.               cl%=aa%
  14273.               INC akt_cl%
  14274.               IF fat%(cl%)<>0
  14275.                 ex%=@fat_check_do
  14276.               ELSE
  14277.                 fat%(cl%)=fat_tst%
  14278.               ENDIF
  14279.               abb%=@was_ist
  14280.               EXIT IF abb%>0 OR ex%<>0
  14281.             LOOP
  14282.           ENDIF
  14283.           '
  14284.           IF aa%=0 AND laenge%(fat_tst%)<>0
  14285.             f$=file$(fat_tst%)
  14286.             err_inf3(cl%,"Freier Cluster in Datei "+f$,"Clusternummer=")
  14287.           ENDIF
  14288.           IF aa%=1
  14289.             f$=file$(fat_tst%)
  14290.             err_inf3(cl%,"Clustereintrag = 1 in Datei "+f$,"Clusternummer=")
  14291.           ENDIF
  14292.           IF aa%>=cpd%+2 AND aa%<cc%
  14293.             f$=file$(fat_tst%)
  14294.             err_inf3(cl%,"Clustereintrag zu groß in Datei "+f$,"Clusternummer=")
  14295.           ENDIF
  14296.           IF aa%=cc%
  14297.             f$=file$(fat_tst%)
  14298.             err_inf3(cl%,"Defekter Cluster in Datei "+f$,"Clusternummer=")
  14299.           ENDIF
  14300.           '
  14301.           IF akt_cl%*bps%*spc%<laenge%(fat_tst%)
  14302.             f$=file$(fat_tst%)
  14303.             err_inf3(laenge%(fat_tst%),"FAT-Belegung < Dateilänge in Datei: "+f$,"DIR-Länge=")
  14304.           ENDIF
  14305.           IF ((att%(fat_tst%) AND &H18)=0) AND (akt_cl%-1)*bps%*spc%>=laenge%(fat_tst%)
  14306.             f$=file$(fat_tst%)
  14307.             err_inf3(laenge%(fat_tst%),"FAT-Belegung > Dateilänge in Datei: "+f$,"DIR-Länge=")
  14308.           ENDIF
  14309.         ELSE
  14310.           IF cl%=0 AND laenge%(fat_tst%)<>0
  14311.             f$=file$(fat_tst%)
  14312.             err_inf3(cl%,"Kein Anfangs-Cluster obwohl Länge > 0 in Datei "+f$,"")
  14313.           ENDIF
  14314.           IF cl%=1
  14315.             f$=file$(fat_tst%)
  14316.             err_inf3(cl%,"Anfangs-Clusternummer = 1 in Datei "+f$,"")
  14317.           ENDIF
  14318.           IF cl%>=cpd%+2
  14319.             f$=file$(fat_tst%)
  14320.             err_inf3(cl%,"Anfangs-Clusternummer zu groß in Datei "+f$,"")
  14321.           ENDIF
  14322.         ENDIF
  14323.       ENDIF
  14324.       abb%=@was_ist
  14325.       EXIT IF abb%>0 OR fer%>=max_err% OR status%<0
  14326.     NEXT fat_tst%
  14327.     '
  14328.     fat%(0)=-3
  14329.     fat%(1)=-3
  14330.   ENDIF
  14331.   mnorm
  14332. RETURN
  14333. FUNCTION fat_check_do
  14334.   .| Glob. Var.: fat_tst%,cl%
  14335.   .| Felder    : laenge%(),fat%(),file$()
  14336.   .| Ruft auf  : err_inf3
  14337.   .| Aufruf in : fat_check-2,
  14338.   LOCAL a%,f1$,f2$,fil$
  14339.   '
  14340.   IF laenge%(fat_tst%)>0
  14341.     a%=MAX(0,fat%(cl%))
  14342.     f1$=file$(a%)
  14343.     f2$=file$(fat_tst%)
  14344.     fat%(cl%)=-4
  14345.     err_inf3(cl%,f1$+" - "+f2$,"verklebt bei Cluster:")
  14346.     RETURN 1
  14347.   ENDIF
  14348.   RETURN 0
  14349. ENDFUNC
  14350. '
  14351. PROCEDURE fat_xor               ! FATs vergleichen
  14352.   .| Glob. Var.: fat_anz%,anf_fat1%,len_fat%,lgs%,utis%,fatbuf%,bps%,buf%
  14353.   .|     status%
  14354.   .| Felder    : whdl&()
  14355.   .| Ruft auf  : lesen,do_list,set_slide,err_inf3,alrt,nur_eine_fat
  14356.   .| Aufruf in : menu_mess-1,
  14357.   LOCAL a%,i%,j%,x%,wwa%
  14358.   '
  14359.   CLR a%
  14360.   i%=fat_anz%-1         ! Anzahl der FATs
  14361.   x%=anf_fat1%+len_fat% ! Start  der 2. FAT
  14362.   WHILE i%
  14363.     CLR j%
  14364.     FOR lgs%=x% TO x%+len_fat%-1
  14365.       lesen
  14366.       do_list
  14367.       set_slide(whdl&(0))
  14368.       IF C:utis%(&H500,L:fatbuf%+j%*bps%,L:buf%,L:bps%/4-1)<>0
  14369.         INC a%
  14370.         err_inf3(lgs%,"FAT-Sektor verschieden","Sektornummer="+STR$(j%+1)+":")
  14371.       ENDIF
  14372.       EXIT IF status%<0
  14373.       INC j%
  14374.     NEXT lgs%
  14375.     DEC i%
  14376.     ADD x%,len_fat%
  14377.   WEND
  14378.   IF a%>0
  14379.     wwa%=@alrt(3,"FATs sind verschieden!",3,"Abbruch")
  14380.   ENDIF
  14381.   IF i%=1
  14382.     nur_eine_fat
  14383.   ENDIF
  14384.   lesen
  14385.   do_list
  14386. RETURN
  14387. PROCEDURE fat_optimum           ! FAT-Verschnitt berechnen
  14388.   .| Glob. Var.: abb%,erg%,drive%,total%,spc%,cluster%,a$,bpc%
  14389.   .| Felder    : laenge%()
  14390.   .| Ruft auf  : find_files,clr_out,out,dec_hex_val$,out_do
  14391.   .| Aufruf in : menu_mess-1,
  14392.   LOCAL ab%,j%,i%,cl%
  14393.   '
  14394.   CLR abb%
  14395.   erg%=3
  14396.   find_files
  14397.   IF abb%=0
  14398.     clr_out("FAT optimal    Laufwerk: "+CHR$(drive%+65))
  14399.     out("Anzahl Dateien         : "+STR$(total%))
  14400.     out("")
  14401.     out("Bytes/Cluster  bel.Cluster   bel.Bytes   aktuell")
  14402.     '
  14403.     FOR j%=9 TO 15
  14404.       ab%=2^j%                  ! Bytes/Cluster
  14405.       CLR cluster%              ! Anzahl der belegten Cluster berechnen
  14406.       FOR i%=1 TO total%
  14407.         cl%=laenge%(i%)/ab%
  14408.         IF (laenge%(i%)/ab%)<>cl%
  14409.           INC cl%
  14410.         ENDIF
  14411.         ADD cluster%,cl%
  14412.       NEXT i%
  14413.       a$=SPACE$(50)
  14414.       MID$(a$,5)=@dec_hex_val$(ab%,6)
  14415.       MID$(a$,17)=@dec_hex_val$(cluster%,6)
  14416.       MID$(a$,31)=@dec_hex_val$(cluster%*ab%,8)
  14417.       IF ab%=bpc%
  14418.         MID$(a$,45)="***"
  14419.       ENDIF
  14420.       out(a$)
  14421.     NEXT j%
  14422.     out_do
  14423.   ENDIF
  14424. RETURN
  14425. '
  14426. PROCEDURE fat_leiche_12         ! Leichencluster prüfen in 12-Bit-FAT
  14427.   .| Glob. Var.: ed%,cpd%,fatbuf%
  14428.   .| Felder    : fat%()
  14429.   .| Aufruf in : fat_graph-1,
  14430.   LOCAL aa%,cz%,cc%,cd%,fat_tst%
  14431.   cc%=ed%-15    ! defekt= FF0-FF7  !RS:BUG: nach ISO und MS-DOS nur $FF7!!!
  14432.   cd%=ed%-8
  14433.   '
  14434.   FOR fat_tst%=2 TO cpd%+1
  14435.     cz%=fatbuf%+fat_tst%*1.5
  14436.     IF EVEN(fat_tst%)=-1
  14437.       aa%=(BYTE{cz%+1} AND 15)*256+BYTE{cz%}
  14438.     ELSE
  14439.       aa%=BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16
  14440.     ENDIF
  14441.     IF aa%>0
  14442.       IF aa%>=cc% AND aa%<=cd%
  14443.         fat%(fat_tst%)=-2
  14444.       ELSE
  14445.         IF fat%(fat_tst%)=0
  14446.           fat%(fat_tst%)=-1
  14447.         ENDIF
  14448.       ENDIF
  14449.     ENDIF
  14450.   NEXT fat_tst%
  14451. RETURN
  14452. PROCEDURE fat_leiche_16         ! ...
  14453.   .| Glob. Var.: ed%,cpd%,fatbuf%
  14454.   .| Felder    : fat%()
  14455.   .| Aufruf in : fat_graph-1,
  14456.   LOCAL cz%,cc%,cd%,fat_tst%,aa%
  14457.   '
  14458.   cc%=ed%-15    ! defekt= FFF0-FFF7  !RS:BUG: nach ISO und MS-DOS nur $FFF7!!!
  14459.   cd%=ed%-8
  14460.   FOR fat_tst%=2 TO cpd%+1
  14461.     cz%=fat_tst%*2+fatbuf%
  14462.     aa%=BYTE{cz%}+BYTE{cz%+1}*256
  14463.     IF aa%>0
  14464.       IF aa%>=cc% AND aa%<=cd%
  14465.         fat%(fat_tst%)=-2
  14466.       ELSE
  14467.         IF fat%(fat_tst%)=0
  14468.           fat%(fat_tst%)=-1
  14469.         ENDIF
  14470.       ENDIF
  14471.     ENDIF
  14472.   NEXT fat_tst%
  14473. RETURN
  14474. '
  14475. PROCEDURE fat_graph             ! FAT grafisch anzeigen
  14476.   .| Glob. Var.: abb%,status%,erg%,bflag%
  14477.   .| Ruft auf  : mtasse,fat_check,fat_leiche_12,fat_leiche_16,fat_graf_do
  14478.   .|     out_do,set_last
  14479.   .| Aufruf in : menu_mess-1,
  14480.   CLR abb%,status%
  14481.   mtasse
  14482.   fat_check
  14483.   IF status%=0 AND abb%=0
  14484.     erg%=3
  14485.     ON (bflag% AND 1)+1 GOSUB fat_leiche_12,fat_leiche_16
  14486.     fat_graf_do
  14487.     out_do
  14488.     set_last(4)
  14489.   ENDIF
  14490. RETURN
  14491. PROCEDURE fat_graf_do           ! ...
  14492.   .| Glob. Var.: cpd%,a$,fg$,drive%
  14493.   .| Felder    : fat%()
  14494.   .| Ruft auf  : do_clr_out,mtasse,out,dec_hex_val$
  14495.   .| Aufruf in : fat_graph-1,last_4-1,
  14496.   LOCAL fgs%,i%,j%
  14497.   '
  14498.   do_clr_out("? = verklebt, V = Verwaltung, X = Leiche, D = defekt, . = frei")
  14499.   mtasse
  14500.   FOR j%=0 TO cpd%+1 STEP 64
  14501.     fgs%=1
  14502.     a$=SPACE$(64)
  14503.     FOR i%=j% TO j%+MIN(64,cpd%+1-j%)
  14504.       IF fat%(i%)>0
  14505.         MID$(a$,fgs%)="b"
  14506.       ELSE
  14507.         MID$(a$,fgs%)=MID$(fg$,fat%(i%)+5,1)
  14508.       ENDIF
  14509.       INC fgs%
  14510.     NEXT i%
  14511.     out(@dec_hex_val$(j%,6)+" "+a$)
  14512.   NEXT j%
  14513.   '
  14514.   out("Drive: "+CHR$(drive%+65)+"   "+STR$(cpd%)+" Cluster")
  14515. RETURN
  14516. PROCEDURE last_4
  14517.   .| Glob. Var.: txt_zeile%,top%,txt_spalte%,ev_clicks&,lgs%,spc%
  14518.   .|     anf_dat%,cpd%,wc%,ed%
  14519.   .| Felder    : whdl&(),out$(),fat%(),file$(),att%(),cluster%()
  14520.   .| Ruft auf  : fat_graf_do,out_do,set_last,lesen,wind_top,info_line
  14521.   .|     dec_hex_val$,read_in_fat,do_list
  14522.   .| Aufruf in : maus_pos-1,
  14523.   LOCAL a%,b%,cl%,klickcl%,anzcl%,i%,a$,f$,x1$,x2$,x3$
  14524.   '
  14525.   IF txt_zeile%+top%>0 AND txt_spalte%>7 AND txt_spalte%<72
  14526.     cl%=(txt_zeile%+top%)*64+txt_spalte%-72
  14527.   ELSE
  14528.     fat_graf_do
  14529.     out_do
  14530.     set_last(4)
  14531.   ENDIF
  14532.   '
  14533.   IF ev_clicks&>1
  14534.     lgs%=(cl%-2)*spc%+anf_dat%
  14535.     lesen
  14536.     wind_top(whdl&(0))
  14537.   ENDIF
  14538.   IF cl%>=cpd%+2
  14539.     out$(0)=SPACE$(wc%)
  14540.     info_line
  14541.   ELSE
  14542.     SELECT fat%(cl%)
  14543.     CASE 1 TO 
  14544.       f$=file$(fat%(cl%))
  14545.       IF (att%(fat%(cl%)) AND 16)<>0
  14546.         f$=f$+"\"
  14547.       ENDIF
  14548.       klickcl%=cl%
  14549.       anzcl%=1
  14550.       cl%=cluster%(fat%(cl%))     ! Start-Cluster
  14551.       a%=cl%/64
  14552.       b%=cl%-a%*64+8
  14553.       a$=MID$(out$(a%+1),b%,1)
  14554.       '
  14555.       IF ASC(a$)<10
  14556.         x1$="b"
  14557.         x2$="b"
  14558.         x3$="b"
  14559.       ELSE
  14560.         x1$="⇧"
  14561.         x2$="⇩"
  14562.         x3$="⇨"
  14563.       ENDIF
  14564.       MID$(out$(a%+1),b%,1)=x1$
  14565.       cl%=@read_in_fat(cl%)
  14566.       WHILE cl%<cpd%+2
  14567.         a%=cl%/64
  14568.         b%=cl%-a%*64+8
  14569.         MID$(out$(a%+1),b%,1)=x3$
  14570.         INC anzcl%
  14571.         cl%=@read_in_fat(cl%)
  14572.       WEND
  14573.       MID$(out$(a%+1),b%,1)=x2$
  14574.       out$(0)=@dec_hex_val$(klickcl%,6)+" "+f$+" ("+STR$(anzcl%)+" Cluster)"+SPACE$(MAX(0,wc%-LEN(f$)-11-LEN(STR$(anzcl%))))
  14575.     CASE -1
  14576.       out$(0)=@dec_hex_val$(cl%,6)+" Leichencluster"
  14577.     CASE -2
  14578.       out$(0)=@dec_hex_val$(cl%,6)+" Defekter Cluster"
  14579.     CASE -3
  14580.       out$(0)=@dec_hex_val$(cl%,6)+" Verwaltungsbereich"
  14581.     CASE -4
  14582.       out$(0)=@dec_hex_val$(cl%,6)+" Verklebter Cluster"
  14583.     ENDSELECT
  14584.     do_list
  14585.   ENDIF
  14586. RETURN
  14587. '
  14588. FUNCTION fat_get_defekt       ! Defekte aus FAT lesen
  14589.   .| Glob. Var.: cc%,ed%,cd%,bflag%,cpd%,cz%,fatbuf%,l$
  14590.   .| Ruft auf  : out
  14591.   .| Aufruf in : disc_check-1,
  14592.   LOCAL aa%,a%,i%
  14593.   '
  14594.   cc%=ed%-15    ! defekt= FFF0-FFF7  !RS:BUG: nach ISO und MS-DOS nur $FFF7!!!
  14595.   cd%=ed%-8
  14596.   CLR a%
  14597.   '
  14598.   IF (bflag% AND 1)<>0
  14599.     FOR i%=2 TO cpd%+1
  14600.       cz%=i%*2+fatbuf%
  14601.       aa%=BYTE{cz%}+BYTE{cz%+1}*256
  14602.       IF aa%>=cc% AND aa%<=cd%
  14603.         INC a%
  14604.         out(l$+"Cluster: "+STR$(i%))
  14605.       ENDIF
  14606.     NEXT i%
  14607.   ELSE
  14608.     FOR i%=2 TO cpd%+1
  14609.       cz%=fatbuf%+i%*1.5
  14610.       IF EVEN(i%)=-1
  14611.         aa%=(BYTE{cz%+1} AND 15)*256+BYTE{cz%}
  14612.       ELSE
  14613.         aa%=BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16
  14614.       ENDIF
  14615.       IF aa%>=cc% AND aa%<=cd%
  14616.         INC a%
  14617.         out(l$+"Cluster: "+STR$(i%))
  14618.       ENDIF
  14619.     NEXT i%
  14620.   ENDIF
  14621.   RETURN a%
  14622. ENDFUNC
  14623. FUNCTION read_in_fat(clus%)   ! Eintrag in FAT lesen
  14624.   .| Glob. Var.: bflag%,fatbuf%
  14625.   .| Aufruf in : last_5-5,dir_secsearch-1,dir_sort_lgs-1,fat_bearbeiten-7
  14626.   .|     fat_cluster-1,fat_test-1,fat_check-1,last_4-2,fat_clr-1,cl_up-1
  14627.   .|     cl_down-1,o_neu-1,
  14628.   LOCAL cz%
  14629.   IF (bflag% AND 1)<>0
  14630.     cz%=fatbuf%+clus%*2
  14631.     RETURN BYTE{cz%}+BYTE{cz%+1}*256
  14632.   ELSE
  14633.     cz%=fatbuf%+clus%*1.5
  14634.     IF EVEN(clus%)=TRUE
  14635.       RETURN (BYTE{cz%+1} AND 15)*256+BYTE{cz%}
  14636.     ELSE
  14637.       RETURN BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16
  14638.     ENDIF
  14639.   ENDIF
  14640. ENDFUNC
  14641. ' ----------
  14642. PROCEDURE fat_clr             ! FAT löschen
  14643.   .| Glob. Var.: ed%,cpd%
  14644.   .| Ruft auf  : read_in_fat,write_in_fat
  14645.   .| Aufruf in : disc_clear-1,
  14646.   LOCAL cc%,fat_tst%,mediabyte|
  14647.   '
  14648.   IF drive%<2   ! Media-Byte bestimmen  !RS: Bestimmung in bios_block verschieben?
  14649.     IF tpd%=40  ! 130-mm-Disketten (5,25 in) mit 40 Spuren
  14650.       IF sid%=1 AND spt%=9 AND len_fat%=2 AND len_dir%=4 AND spc%=1 AND cpd%=351
  14651.         mediabyte|=&HFC  ! Diskette ISO Typ 201
  14652.       ELSE IF sid%=2 AND spt%=9 AND len_fat%=2 AND len_dir%=7 AND spc%=2 AND cpd%=354
  14653.         mediabyte|=&HFD  ! Diskette ISO Typ 202
  14654.       ELSE IF sid%=1 AND spt%=8 AND len_fat%=1 AND len_dir%=4 AND spc%=1 AND cpd%=313
  14655.         mediabyte|=&HFE
  14656.       ELSE IF sid%=2 AND spt%=8 AND len_fat%=1 AND len_dir%=7 AND spc%=2 AND cpd%=315
  14657.         mediabyte|=&HFF
  14658.       ELSE
  14659.         mediabyte|=&HF9
  14660.       ENDIF
  14661.     ELSE        ! 90-mm-Disketten (3,5 in) oder 130-mm-Disketten (5,25 in) mit 80 Spuren
  14662.       IF spt%>=18
  14663.         mediabyte|=&HF0
  14664.       ELSE
  14665.         mediabyte|=&HF9
  14666.       ENDIF
  14667.     ENDIF
  14668.   ELSE
  14669.     mediabyte|=&HF8  ! Fest- oder Wechselplatte
  14670.   ENDIF
  14671.   write_in_fat(&HFF00 AND mediabyte|,0)  ! Media-Byte in die FAT eintragen
  14672.   write_in_fat(&HFFFF,1)
  14673.   cc%=ed%-8
  14674.   FOR fat_tst%=2 TO cpd%+1
  14675.     IF cc%<>@read_in_fat(fat_tst%)
  14676.       write_in_fat(0,fat_tst%)
  14677.     ENDIF
  14678.   NEXT fat_tst%
  14679. RETURN
  14680. PROCEDURE write_in_fat(was%,wohin%)
  14681.   .| Glob. Var.: bflag%,fatbuf%
  14682.   .| Aufruf in : disc_check_err-1,last_5-3,fat_bearbeiten-4,fat_test-1
  14683.   .|     fat_clr-1,
  14684.   LOCAL cz%
  14685.   '
  14686.   IF (bflag% AND 1)<>0
  14687.     cz%=fatbuf%+wohin%*2
  14688.     BYTE{cz%}=(was% AND &HFF)
  14689.     BYTE{cz%+1}=(was% AND &HFF00)/256
  14690.   ELSE
  14691.     cz%=fatbuf%+wohin%*1.5
  14692.     IF EVEN(wohin%)=-1
  14693.       BYTE{cz%+1}=(BYTE{cz%+1} AND 240)+(was% AND &HF00)/256
  14694.       BYTE{cz%}=(was% AND 255)
  14695.     ELSE
  14696.       BYTE{cz%+1}=(was% AND &HFF0)/16
  14697.       BYTE{cz%}=(BYTE{cz%} AND 15)+(was% AND 15)*16
  14698.     ENDIF
  14699.   ENDIF
  14700. RETURN
  14701. PROCEDURE write_fat           ! FAT schreiben
  14702.   .| Glob. Var.: fat_anz%,anf_fat1%,status%,fatbuf%,len_fat%,drive%
  14703.   .| Ruft auf  : err_inf
  14704.   .| Aufruf in : disc_clear-1,disc_check-1,last_5-1,fat_bearbeiten-1
  14705.   .|     fat_test-1,
  14706.   LOCAL a%,i%,x%
  14707.   '
  14708.   i%=fat_anz%   ! Anzahl der FATs
  14709.   x%=anf_fat1%  ! Start  der 1. FAT
  14710.   WHILE i%
  14711.     status%=@rwabs(1,fatbuf%,len_fat%,x%,drive%)
  14712.     IF status%=-14
  14713.       status%=@rwabs(1,fatbuf%,len_fat%,x%,drive%)
  14714.     ENDIF
  14715.     err_inf(status%)
  14716.     DEC i%
  14717.     ADD x%,len_fat%
  14718.   WEND
  14719. RETURN
  14720. PROCEDURE nur_eine_fat        ! ist nur eine FAT da
  14721.   .| Ruft auf  : alrt
  14722.   .| Aufruf in : fat_xor-1,fat_read2-1,
  14723.   ~@alrt(3,"Laufwerk hat nur eine FAT!",1,"Abbruch")
  14724. RETURN
  14725. PROCEDURE fat_read1           ! 1. Sektor der FAT 1 einlesen
  14726.   .| Glob. Var.: lgs%,anf_fat1%
  14727.   .| Ruft auf  : change,lesen,do_list
  14728.   .| Aufruf in : menu_mess-1,
  14729.   change
  14730.   lgs%=anf_fat1%
  14731.   lesen
  14732.   do_list
  14733. RETURN
  14734. PROCEDURE fat_read2           ! 1. Sektor einer evtl. FAT 2 einlesen
  14735.   .| Glob. Var.: fat_anz%,lgs%,anf_fat1%,len_fat%
  14736.   .| Ruft auf  : change,lesen,do_list,nur_eine_fat
  14737.   .| Aufruf in : menu_mess-1,
  14738.   change
  14739.   IF fat_anz%>1
  14740.     lgs%=anf_fat1%+len_fat%
  14741.     lesen
  14742.     do_list
  14743.   ELSE
  14744.     nur_eine_fat
  14745.   ENDIF
  14746. RETURN
  14747. PROCEDURE set_cursor_in_fat(cluster%)
  14748.   .| Glob. Var.: bflag%,lgs%,anf_fat1%,bps%,z%,wzb%,yt%,xt%,hex!
  14749.   .| Ruft auf  : lesen,set_tz,do_list
  14750.   .| Aufruf in : fat_bearbeiten-1,
  14751.   LOCAL b%
  14752.   '
  14753.   IF (bflag% AND 1)<>0
  14754.     lgs%=anf_fat1%+((cluster%*2)/bps%)
  14755.     b%=cluster%*2
  14756.   ELSE
  14757.     lgs%=anf_fat1%+((cluster%*1.5)/bps%)
  14758.     b%=cluster%*1.5
  14759.   ENDIF
  14760.   lesen
  14761.   '
  14762.   b%=b% MOD bps%
  14763.   z%=INT(b%/wzb%)*wzb%
  14764.   b%=b%-z%
  14765.   yt%=b%/16
  14766.   xt%=b%-yt%*16+51
  14767.   IF hex!=TRUE
  14768.     xt%=(b%-yt%*16)*3
  14769.   ENDIF
  14770.   set_tz
  14771.   do_list
  14772. RETURN
  14773. ' ----------
  14774. PROCEDURE cl_up
  14775.   .| Glob. Var.: cluster%,ed%,lgs%,spc%,anf_dat%
  14776.   .| Ruft auf  : read_in_fat,lesen,alrt,do_list
  14777.   .| Aufruf in : menu_mess-1,
  14778.   LOCAL aa%
  14779.   IF cluster%>1
  14780.     aa%=@read_in_fat(cluster%)
  14781.     IF aa%>=2 AND aa%<cpd%+2
  14782.       lgs%=(aa%-2)*spc%+anf_dat%
  14783.       lesen
  14784.     ELSE
  14785.       ~@alrt(3,"Keine weitere Verkettung.",1," Aha ")
  14786.     ENDIF
  14787.     do_list
  14788.   ELSE
  14789.     ~@alrt(3,"* Clusterverkettung folgen *|Das geht nur mit Clustern|im Datenbereich!",1," Aha ")
  14790.   ENDIF
  14791. RETURN
  14792. PROCEDURE cl_down
  14793.   .| Glob. Var.: cluster%,lgs%,spc%,anf_dat%
  14794.   .| Ruft auf  : mtasse,read_in_fat,mnorm,alrt,lesen,do_list
  14795.   .| Aufruf in : menu_mess-1,
  14796.   LOCAL j%
  14797.   '
  14798.   IF cluster%>1
  14799.     j%=cluster%
  14800.     mtasse
  14801.     REPEAT
  14802.       DEC j%
  14803.       IF j%=1
  14804.         j%=cpd%+1
  14805.       ENDIF
  14806.     UNTIL @read_in_fat(j%)=cluster% OR j%=cluster%
  14807.     mnorm
  14808.     IF j%=cluster%
  14809.       ~@alrt(3,"Keine weitere Verkettung.",1," Aha ")
  14810.     ELSE
  14811.       lgs%=(j%-2)*spc%+anf_dat%
  14812.       lesen
  14813.       do_list
  14814.     ENDIF
  14815.   ELSE
  14816.     ~@alrt(3,"* Clusterverkettung folgen *|Das geht nur mit Clustern|im Datenbereich!",1," Aha ")
  14817.   ENDIF
  14818. RETURN
  14819. ' ----------------------
  14820. PROCEDURE bios_block(drive%)
  14821.   .| Glob. Var.: bpb%,bps%,spc%,bpc%,len_dir%,len_fat%,anf_fat2%,anf_dat%,cpd%
  14822.   .|     bflag%,spd%,tpd%,sid%,spt%,hid%,serie%,anf_dir%,anf_fat1%,fat_size%
  14823.   .|     wwa%,wa$,fatbuf%,ver$,buf%,status%,l_end%
  14824.   .| Felder    : l_end%()
  14825.   .| Ruft auf  : media,alrt,do_exit,err_inf
  14826.   .| Aufruf in : boot_sec-1,last_5-1,dir_sort-1,fat_bearbeiten-2,fat_test-1,
  14827.   LOCAL fat_size2%
  14828.   '
  14829.   CLR bpb%
  14830.   IF @media(drive%)=0
  14831.     bpb%=BIOS(7,drive%)
  14832.     IF bpb%>0
  14833.       bps%=CARD{bpb%}
  14834.       spc%=CARD{bpb%+2}
  14835.       bpc%=CARD{bpb%+4}
  14836.       len_dir%=CARD{bpb%+6}
  14837.       len_fat%=CARD{bpb%+8}
  14838.       anf_fat2%=CARD{bpb%+10}  ! Beginn der 2. FAT, bei einer FAT deren Beginn
  14839.       anf_dat%=CARD{bpb%+12}
  14840.       cpd%=CARD{bpb%+14}
  14841.       bflag%=CARD{bpb%+16}
  14842.       spd%=anf_dat%+cpd%*spc%
  14843.       IF drive%<2
  14844.         tpd%=CARD{bpb%+18}
  14845.         sid%=CARD{bpb%+20}
  14846.         spt%=CARD{bpb%+22} DIV sid%
  14847.         spd%=spt%*sid%*tpd%
  14848.         hid%=CARD{bpb%+26}
  14849.         serie%=CARD{bpb%+28}*256+BYTE{bpb%+30}
  14850.       ELSE
  14851.         CLR tpd%,sid%,spt%,hid%,serie%
  14852.       ENDIF
  14853.       '
  14854.       anf_dir%=anf_dat%-len_dir%
  14855.       IF (bflag% AND 2)<>0  ! Nur eine FAT vorhanden!
  14856.         anf_fat1%=anf_fat2%
  14857.       ELSE
  14858.         anf_fat1%=anf_fat2%-len_fat%
  14859.       ENDIF
  14860.       '
  14861.       fat_size2%=len_fat%*bps%
  14862.       '
  14863.       IF fat_size2%>fat_size%
  14864.         wwa%=@alrt(1,"Größe des FAT-Puffer "+STR$(fat_size%)+" Byte.|Notwendige Größe "+STR$(fat_size2%)+" Byte.|FAT-Puffer auf diese Größe anlegen?",1,"Ja| Nein ")
  14865.         IF wwa%=1
  14866.           ~MFREE(fatbuf%)
  14867.           fatbuf%=MALLOC(fat_size2%)
  14868.           IF fatbuf%=0
  14869.             ~@alrt(3,ver$+"|Kein Speicher für FAT!",1,"Abbruch")
  14870.             ~MFREE(buf%)
  14871.             do_exit
  14872.           ENDIF
  14873.           fat_size%=fat_size2%
  14874.         ELSE
  14875.           len_fat%=fat_size% DIV bps%
  14876.         ENDIF
  14877.       ENDIF
  14878.       '
  14879.       status%=@rwabs(0,fatbuf%,len_fat%,anf_fat2%,drive%)
  14880.       IF status%=-14
  14881.         status%=@rwabs(0,fatbuf%,len_fat%,anf_fat2%,drive%)
  14882.       ENDIF
  14883.       err_inf(status%)
  14884.     ENDIF
  14885.   ELSE
  14886.     bpb%=-1
  14887.   ENDIF
  14888.   l_end%(0)=bps%
  14889.   l_end%=bps%
  14890. RETURN
  14891. PROCEDURE floppy_param
  14892.   .| Ruft auf  : boot_sec,flex_dim
  14893.   .| Aufruf in : disc_check-1,pfad_compare-1,find_files-1,
  14894.   boot_sec
  14895.   flex_dim
  14896. RETURN
  14897. PROCEDURE flex_dim
  14898.   .| Glob. Var.: anf%,ed%,bflag%,cpd%,fatbuf%,utis%,srep%,rdim%,max_files%
  14899.   .| Aufruf in : floppy_param-1,
  14900.   LOCAL ci%,cz%,ca%,cc%,s%
  14901.   '
  14902.   CLR anf%
  14903.   cc%=ed%-8
  14904.   IF (bflag% AND 1)=0
  14905.     FOR ci%=2 TO cpd%+1
  14906.       cz%=ci%*1.5+fatbuf%
  14907.       IF EVEN(ci%)=TRUE
  14908.         ca%=(BYTE{cz%+1} AND 15)*256+BYTE{cz%}
  14909.       ELSE
  14910.         ca%=BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16
  14911.       ENDIF
  14912.       IF ca%>=cc%
  14913.         INC anf%
  14914.       ENDIF
  14915.     NEXT ci%
  14916.   ELSE
  14917.     anf%=C:utis%(&H700,L:fatbuf%,L:fatbuf%+cpd%*2,L:ed%-9)
  14918.   ENDIF
  14919.   '
  14920.   s%=MAX(anf%*1.1,112)
  14921.   IF srep%>0
  14922.     s%=MAX(112,s%*10)
  14923.   ENDIF
  14924.   IF rdim%>0
  14925.     ERASE file$(),laenge%(),att%(),cluster%(),sec%()
  14926.   ENDIF
  14927.   rdim%=1
  14928.   DIM file$(s%),laenge%(s%),att%(s%),cluster%(s%),sec%(s%)
  14929.   max_files%=s%
  14930. RETURN
  14931. ' ----------------------
  14932. PROCEDURE find_files
  14933.   .| Glob. Var.: drive%,find_drive%,find%,last_srep%,srep%,total%,abb%,last%
  14934.   .|     cc%,ed%,cd%,f$,pfad$
  14935.   .| Ruft auf  : alrt,mtasse,floppy_param,o_neu,set_crcbuf,mnorm
  14936.   .| Aufruf in : file_repair-1,dir_secsearch-1,dir_files-1,dir_fldren-1
  14937.   .|     dir_sort-1,fat_cluster-1,fat_check-1,fat_optimum-1,
  14938.   LOCAL wwa%
  14939.   '
  14940.   wwa%=1
  14941.   IF drive%=find_drive% AND find%=1 AND last_srep%=srep%
  14942.     wwa%=@alrt(2,"Verzeichnisse einlesen?",2,"Ok| Nee ")
  14943.   ENDIF
  14944.   last_srep%=srep%
  14945.   IF find%=0 OR wwa%=1
  14946.     mtasse
  14947.     CLR total%,abb%,last%
  14948.     find_drive%=drive%
  14949.     find%=1
  14950.     floppy_param
  14951.     cc%=ed%-15
  14952.     cd%=ed%-8
  14953.     f$=STRING$(11,0)
  14954.     pfad$=CHR$(drive%+65)+":\"
  14955.     o_neu(0)
  14956.   ENDIF
  14957.   IF abb%>0
  14958.     ~@alrt(3,"Vorgang abgebrochen.",1," Aha ")
  14959.     CLR total%,find%
  14960.   ENDIF
  14961.   set_crcbuf
  14962.   mnorm
  14963. RETURN
  14964. '
  14965. ' o_neu
  14966. PROCEDURE o_neu(cluster%)
  14967.   .| Glob. Var.: lgs%,anf_dir%,spc%,anf_dat%,cpd%,status%,buf%,drive%,abb%
  14968.   .|     srep%,f$,total%,pfad$,bps%,max_files%,cd%,spd%,cc%
  14969.   .| Felder    : file$(),att%(),sec%(),cluster%(),laenge%()
  14970.   .| Ruft auf  : err_inf,was_ist,nam_conv$,o_neu,read_in_fat
  14971.   .| Aufruf in : find_files-1,o_neu-1,
  14972.   LOCAL a%,nr%,cl%,durch%,x%,y%,ogs%,clx%,lgx%,att%,n%
  14973.   LOCAL wurzel%
  14974.   '
  14975.   IF cluster%=0
  14976.     lgs%=anf_dir%
  14977.     wurzel%=TRUE
  14978.     n%=1     ! im Wurzelverzeichnis Sektoren einzeln lesen
  14979.   ELSE
  14980.     lgs%=(cluster%-2)*spc%+anf_dat%
  14981.     n%=spc%  ! in Ordnern den ganzen Cluster lesen
  14982.   ENDIF
  14983.   lgx%=lgs%
  14984.   clx%=cluster%
  14985.   '
  14986.   FOR durch%=1 TO 2                     ! 1. Durchgang=alle Namen merken
  14987.     '                                   ! 2. Durchgang Ordner auflösen
  14988.     lgs%=lgx%
  14989.     cluster%=clx%
  14990.     EXIT IF cluster%>=cpd%+2
  14991.     '
  14992.     DO
  14993.       status%=@rwabs(0,buf%,n%,lgs%,drive%)     ! Sektor oder Cluster lesen
  14994.       IF status%<>0
  14995.         err_inf(status%)
  14996.       ENDIF
  14997.       EXIT IF status%<>0
  14998.       CLR nr%
  14999.       '
  15000.       x%=buf%                                   ! ab Pufferanfang
  15001.       REPEAT
  15002.         abb%=@was_ist
  15003.         EXIT IF abb%>0
  15004.         '
  15005.         y%=BYTE{x%}                             ! 1. Zeichen
  15006.         '
  15007.         IF durch%=2
  15008.           INC nr%
  15009.         ENDIF
  15010.         '
  15011.         IF y%<>46               ! kein "." oder ".."
  15012.           '
  15013.           IF (y%>0 AND y%<>&HE5) OR (srep%=1 AND y%=&HE5)   ! Ersten Buchstaben des Namens kontrollieren
  15014.             '
  15015.             att%=BYTE{x%+11}
  15016.             cl%=BYTE{x%+26}+BYTE{x%+27}*&H100
  15017.             BMOVE x%,V:f$,11
  15018.             '
  15019.             IF durch%=1
  15020.               IF (srep%>0 AND y%=&HE5) OR (srep%=0 AND y%<>&HE5) OR ((att% AND 16)<>0 AND y%<>&HE5)
  15021.                 INC total%
  15022.                 file$(total%)=pfad$+@nam_conv$(f$,0)
  15023.                 att%(total%)=att%
  15024.                 sec%(total%)=lgs%+(x%-buf%)/bps%
  15025.                 cluster%(total%)=cl%
  15026.                 laenge%(total%)=MIN(2.14748E+09,BYTE{x%+28}+BYTE{x%+29}*&H100+BYTE{x%+30}*&H10000+BYTE{x%+31}*&H1000000)
  15027.               ENDIF
  15028.             ELSE
  15029.               IF (att% AND 16)<>0 AND y%<>&HE5  ! Ordner?
  15030.                 pfad$=pfad$+@nam_conv$(f$,0)+"\"
  15031.                 ogs%=lgs%
  15032.                 '
  15033.                 o_neu(cl%)        ! eine Ebene tiefer
  15034.                 '
  15035.                 lgs%=ogs%         ! kommt zurück, im alten Sektor weiter machen
  15036.                 status%=@rwabs(0,buf%,n%,lgs%,drive%)
  15037.                 IF status%<>0
  15038.                   err_inf(status%)
  15039.                 ENDIF
  15040.                 x%=buf%+(nr%-1)*32
  15041.               ENDIF
  15042.             ENDIF
  15043.             '
  15044.           ENDIF
  15045.         ENDIF
  15046.         '
  15047.         ADD x%,32
  15048.       UNTIL x%>=buf%+n%*bps% OR total%>=max_files% OR abb%>0
  15049.       '
  15050.       IF wurzel%=FALSE
  15051.         cluster%=@read_in_fat(cluster%)
  15052.       ENDIF
  15053.       '
  15054.       EXIT IF abb%<>0 OR total%>=max_files%
  15055.       EXIT IF wurzel%=FALSE AND (cluster%<2 OR cluster%>=cpd%+2)
  15056.       EXIT IF wurzel%=TRUE AND lgs%+1>=anf_dat%
  15057.       IF wurzel%=TRUE
  15058.         INC lgs%
  15059.       ELSE
  15060.         lgs%=(cluster%-2)*spc%+anf_dat%
  15061.       ENDIF
  15062.     LOOP
  15063.     EXIT IF abb%>0 OR total%>=max_files%
  15064.   NEXT durch%
  15065.   '
  15066.   pfad$=LEFT$(pfad$,RINSTR(LEN(pfad$)-1,pfad$,"\"))
  15067. RETURN
  15068. ' ----------------------
  15069. PROCEDURE set_pfad(ff$)
  15070.   .| Glob. Var.: fehler%
  15071.   .| Ruft auf  : dsetdrv,dsetpath
  15072.   .| Aufruf in : v_opnvwk-1,do_pexec-1,do_exit-1,
  15073.   LOCAL i%
  15074.   '
  15075.   CLR fehler%
  15076.   IF MID$(ff$,2,1)=":"          ! Falls nötig Drive wechseln
  15077.     ~@dsetdrv(ASC(UPPER$(ff$))-65)
  15078.     ff$=RIGHT$(ff$,LEN(ff$)-2)
  15079.   ENDIF
  15080.   IF fehler%>=0
  15081.     i%=RINSTR(ff$,"\")
  15082.     IF i%>0
  15083.       ff$=LEFT$(ff$,i%)
  15084.     ENDIF
  15085.     ~@dsetpath(ff$)
  15086.   ENDIF
  15087. RETURN
  15088. PROCEDURE get_pfad
  15089.   .| Glob. Var.: pfad$,fehler%,drive%
  15090.   .| Aufruf in : var_init-1,do_pexec-1,start_shell-1,
  15091.   pfad$=STRING$(256,0)
  15092.   fehler%=GEMDOS(71,L:V:pfad$,0)
  15093.   IF fehler%=0
  15094.     pfad$=CHR$(drive%+65)+":"+LEFT$(pfad$,INSTR(pfad$,CHR$(0))-1)
  15095.     IF RIGHT$(pfad$,1)<>"\"
  15096.       pfad$=pfad$+"\"
  15097.     ENDIF
  15098.   ENDIF
  15099. RETURN
  15100. PROCEDURE wandeln(b$)
  15101.   .| Glob. Var.: a$
  15102.   .| Aufruf in : datei_suchen-1,lies_3-1,
  15103.   ' Wandelt Dateinamen (Beispiel: willi.img, w*.xx) in einen 12 Zeichen langen
  15104.   ' String             (Beispiel: willi   .img, w*      .xx )
  15105.   LOCAL a%
  15106.   a$=b$
  15107.   a%=INSTR(a$,".")
  15108.   IF a%>0
  15109.     b$=LEFT$(a$,a%-1)
  15110.     b$=b$+SPACE$(8-LEN(b$))
  15111.     a$=b$+RIGHT$(a$,LEN(a$)-a%+1)
  15112.     a$=a$+SPACE$(12-LEN(a$))
  15113.   ELSE
  15114.     a$=a$+SPACE$(12-LEN(a$))
  15115.     MID$(a$,9,1)="."
  15116.   ENDIF
  15117. RETURN
  15118. PROCEDURE alltoone(b$)
  15119.   .| Glob. Var.: a$
  15120.   .| Aufruf in : datei_suchen-1,
  15121.   ' Wandelt Allquantor ("*") in Einfachquantor ("?") um
  15122.   ' (w*      .*  -->w???????.???)
  15123.   LOCAL t%
  15124.   a$=b$
  15125.   FOR t%=1 TO 8
  15126.     IF MID$(a$,t%,1)="*"
  15127.       MID$(a$,t%)=STRING$(9-t%,"?")
  15128.       t%=8
  15129.     ENDIF
  15130.   NEXT t%
  15131.   FOR t%=10 TO 12
  15132.     IF MID$(a$,t%,1)="*"
  15133.       MID$(a$,t%)=STRING$(13-t%,"?")
  15134.       t%=12
  15135.     ENDIF
  15136.   NEXT t%
  15137. RETURN
  15138. PROCEDURE n_compare(a$,b$)
  15139.   .| Glob. Var.: gleich!
  15140.   .| Ruft auf  : n_compare
  15141.   .| Aufruf in : lies_3-1,n_compare-1,
  15142.   ' Zwei Strings vergleichen
  15143.   ' Die Strings müssen per Wandeln und Alltoone vorbehandelt werden
  15144.   ' OUT: Gleich!=True, wenn Vergleich paßt
  15145.   IF LEN(a$)=0 AND LEN(b$)=0
  15146.     gleich!=TRUE
  15147.   ELSE
  15148.     IF LEN(a$)<>LEN(b$)
  15149.       gleich!=FALSE
  15150.     ELSE
  15151.       IF LEFT$(a$,1)=LEFT$(b$,1) OR LEFT$(a$,1)="?" OR LEFT$(b$,1)="?"
  15152.         n_compare(MID$(a$,2),MID$(b$,2))
  15153.       ELSE
  15154.         gleich!=FALSE
  15155.       ENDIF
  15156.     ENDIF
  15157.   ENDIF
  15158. RETURN
  15159. PROCEDURE do_pfad(xpf$)
  15160.   .| Glob. Var.: pfad$
  15161.   .| Aufruf in : fsel-1,
  15162.   pfad$=LEFT$(xpf$,RINSTR(xpf$,"\"))
  15163.   IF pfad$=""
  15164.     pfad$="\"
  15165.   ENDIF
  15166. RETURN
  15167. PROCEDURE fehler_behandlung
  15168.   .| Glob. Var.: utis%
  15169.   .| Ruft auf  : alrt,media_all,do_exit (tot)
  15170.   ~@alrt(5,"SED-Fehler "+STR$(ERR)+"! ",1,"Abbruch")
  15171.   IF utis%>0
  15172.     ~@media_all
  15173.   ENDIF
  15174.   do_exit
  15175. RETURN
  15176. ' ----------------------
  15177. PROCEDURE disass
  15178.   .| Glob. Var.: pc%,buf%,z%,tz%,drel%,ram_addr%,erg%,ram.konv%,distempl&
  15179.   .| Ruft auf  : alrt,eingabe,clr_out,temple_disass,sed_disass,out_do
  15180.   .| Aufruf in : menu_mess-1,control-1,
  15181.   LOCAL was%,tanz%,sanz%
  15182.   was%=@alrt(2,"Was disassemblieren?",1,"Buffer|RAM|Abbruch")
  15183.   IF was%<3
  15184.     IF was%=1
  15185.       pc%=buf%+z%+tz%
  15186.       drel%=buf%                ! Wenn Buffer dann Adresse auf 0000 umrechnen
  15187.     ELSE
  15188.       CLR drel%
  15189.       pc%=ram_addr%+tz%
  15190.     ENDIF
  15191.     IF EVEN(pc%)=FALSE
  15192.       INC pc%
  15193.     ENDIF
  15194.     erg%=3
  15195.     sanz%=@eingabe("Wieviele Zeilen disassemblieren?",100)
  15196.     CLR tanz%
  15197.     clr_out("Disassembler")
  15198.     IF (OB_STATE(ram.konv%,distempl&) AND 1)<>0
  15199.       temple_disass
  15200.     ELSE
  15201.       sed_disass
  15202.     ENDIF
  15203.     out_do
  15204.   ENDIF
  15205. RETURN
  15206. PROCEDURE temple_disass
  15207.   .| Glob. Var.: tmon%,sanz%,utis%,pc%,fdc3%
  15208.   .| Ruft auf  : search_cookie,alrt,mtasse,out
  15209.   .| Aufruf in : disass-1,
  15210.   LOCAL a$,cpu_typ%
  15211.   '
  15212.   tmon%=@search_cookie("TMon",0)
  15213.   IF tmon%=0
  15214.     ~@alrt(3,"Kann 'Templemon' nicht finden.",1,"Abbruch")
  15215.   ELSE
  15216.     '
  15217.     ' (CODE $800) Templemon-Disassembler aufrufen
  15218.     ' IN: A4.l = Zeiger auf Adresse, A5.l =Zeiger auf Templemon
  15219.     '     D4.l = CPU Typ           , D5.l =Rückgabe Parameter
  15220.     ' OUT:Parameterblock (D5)
  15221.     '     L:  Adresse des Strings umspeichern
  15222.     '     L:  Befehlsnummer?
  15223.     '     L:  Adresse des nächsten Befehls
  15224.     '     L:  Codetabelle?
  15225.     ' Parameterblock: fdc3% (1100 Bytes von FDC mißbraucht)
  15226.     '
  15227.     mtasse
  15228.     cpu_typ%=&H13
  15229.     WHILE sanz%
  15230.       ~C:utis%(&H800,L:pc%,L:tmon%,L:cpu_typ%,L:fdc3%)
  15231.       a$=CHAR{{fdc3%}}
  15232.       out(a$)
  15233.       pc%={fdc3%+8}
  15234.       DEC sanz%
  15235.     WEND
  15236.   ENDIF
  15237. RETURN
  15238. PROCEDURE sed_disass
  15239.   .| Glob. Var.: pc%,location$,hexdump$,mnemonic$,operand$,d_ascii$,tanz%
  15240.   .|     branch!,adjusted_pc%,sanz%
  15241.   .| Ruft auf  : mtasse,68000_disassembler,out
  15242.   .| Aufruf in : disass-1,
  15243.   mtasse
  15244.   DO
  15245.     68000_disassembler(pc%,TRUE,TRUE,TRUE)
  15246.     location$=location$+" "
  15247.     hexdump$=hexdump$+SPACE$(21-LEN(hexdump$))
  15248.     mnemonic$=mnemonic$+SPACE$(8-LEN(mnemonic$))
  15249.     operand$=operand$+SPACE$(MAX(0,28-LEN(operand$)))
  15250.     out(location$+hexdump$+mnemonic$+operand$+d_ascii$)
  15251.     INC tanz%
  15252.     IF branch!=TRUE
  15253.       out(location$+STRING$(66,"-"))
  15254.     ENDIF
  15255.     SWAP pc%,adjusted_pc%
  15256.     EXIT IF sanz%<=tanz%
  15257.   LOOP
  15258. RETURN
  15259. PROCEDURE 68000_disassembler(pc%,location!,hexdump!,ascii!)
  15260.   .| Glob. Var.: dis_init%,location$,hexdump$,mnemonic$,operand$,d_ascii$
  15261.   .|     d_offset%,destination!,extendflag%,branch!,legal!,instruction%
  15262.   .|     instruction_group%,drel%,adjusted_pc%,hexdump%,char%,ascii%
  15263.   .| Felder    : miscellaneous$()
  15264.   .| Ruft auf  : initiate_68000_disassembler,0,1,4,5,6,7,8,9,10,11,12,14,15
  15265.   .| Aufruf in : sed_disass-1,
  15266.   ' ******************************************************
  15267.   ' * AUTOR         : ERIK HANSEN  (Copyright (C) by ST-Computer)
  15268.   ' * GESCHRIEBEN   : FEBRUAR 1987. IN KRUSAA. DÄNEMARK
  15269.   ' ******************************************************
  15270.   IF dis_init%=0
  15271.     initiate_68000_disassembler
  15272.   ENDIF
  15273.   CLR location$,hexdump$,mnemonic$,operand$,d_ascii$
  15274.   CLR d_offset%,destination!,extendflag%,branch!
  15275.   legal!=TRUE
  15276.   ' * DIE MNEMONICS DER M68000 SIND IN 16 GRUPPEN AUFGETEILT. DIESE GRUPPEN
  15277.   ' * SIND IN DEN HÖCHSTEN 4 BITS DER OPCODES CODIERT. HIER WERDEN DIE GRUPPEN
  15278.   ' * ERMITTELT UND DIE DAZU GEHÖRENDE PROCEDURE ANGESPRUNGEN.
  15279.   instruction%=DPEEK(pc%)
  15280.   instruction_group%=(instruction% AND 61440) DIV 4096
  15281.   ON instruction_group%+1 GOSUB 0,1,1,1,4,5,6,7,8,9,10,11,12,9,14,15
  15282.   ' * HIER WERDEN EINIGE VON DEN VARIABLEN DEFINIERT,
  15283.   ' * DIE NOCH NICHT DEFINIERT WURDEN
  15284.   ' * ----------------------------------
  15285.   ' * ALLE VARIABLEN, DIE ZURÜCKGELIEFERT WERDEN KÖNNEN, SIND
  15286.   ' * ----------------------------------
  15287.   ' * Location$                 : DIE ADRESSE DES OPCODES IN HEX$
  15288.   ' * Hexdump$                  : DER OPCODE UND ZUGEHÖRENDE BYTES IN HEX$
  15289.   ' * Mnemonic$                 : DER ÜBERSETZTE OPCODE
  15290.   ' * Operand$                  : DIE DEM OPCODE FOLGENDEN OPERANDEN
  15291.   ' * D_Ascii$                  : Hexdump$ IN ASCII ÜBERSETZT
  15292.   ' * ----------------------------------
  15293.   ' * Branch                    : KÖNNEN ZWEI WERTE ANNEHMEN.  (True/False)
  15294.   ' *        True - LETZER OPCODE WAR EINER VON: JMP/BRA/RTS/RTE/RTR
  15295.   ' *       False - LETZER OPCODE WAR ALLES ANDERE
  15296.   ' * ----------------------------------
  15297.   ' * Adjusted_pc%              : ZEIGER AUF DEN NÄCHSTEN OPCODE
  15298.   IF location!=TRUE
  15299.     location$=HEX$(pc%-drel%,6)
  15300.   ENDIF
  15301.   d_offset%=d_offset% AND legal!
  15302.   adjusted_pc%=pc%+2+d_offset%*2
  15303.   IF hexdump!=TRUE
  15304.     FOR hexdump%=pc% TO adjusted_pc%-1
  15305.       hexdump$=hexdump$+HEX$(PEEK(hexdump%),2)
  15306.     NEXT hexdump%
  15307.   ENDIF
  15308.   IF ascii!=TRUE
  15309.     FOR char%=pc% TO adjusted_pc%-1
  15310.       ascii%=PEEK(char%)
  15311.       IF ascii%<32
  15312.         ascii%=46
  15313.       ENDIF
  15314.       d_ascii$=d_ascii$+CHR$(ascii%)
  15315.     NEXT char%
  15316.   ENDIF
  15317.   IF NOT legal!
  15318.     mnemonic$=miscellaneous$(4)
  15319.     operand$="$"+hexdump$
  15320.   ENDIF
  15321. RETURN
  15322. PROCEDURE 0
  15323.   .| Glob. Var.: status_register%,instruction%,pc_memory%,pc%,bit_eight%
  15324.   .|     dmode%,size%,register%,legal!,mnemonic$,operand$,function%,sign$
  15325.   .|     displacement%,displacement$,d_offset%,check%,extendflag%
  15326.   .| Felder    : bittest$(),register$(),extend$()
  15327.   .| Ruft auf  : isolate_single_bits,assemble_operands
  15328.   .|     immediate_addressing_two,immediate_addressing_three
  15329.   .| Aufruf in : 68000_disassembler-1,
  15330.   ' * BEFEHLE DER GRUPPE 0
  15331.   ' * ----------------------------------
  15332.   ' * BCLR       : BCHG      : BTST        : BSET       : MOVEP(W/L) :
  15333.   ' * ORI        : ANDI      : SUBI        : ADDI       : EORI       : CMPI
  15334.   ' * ORI TO CCR : ORI TO SR : ANDI TO CCR : ANDI TO SR : EORI TO SR :
  15335.   isolate_single_bits
  15336.   status_register%=instruction% AND 60
  15337.   pc_memory%=pc%
  15338.   IF bit_eight%=1
  15339.     IF dmode%<>1
  15340.       IF dmode%=7
  15341.         IF (size%=0 AND register%>3) OR (size%>0 AND register%>1)
  15342.           CLR legal!
  15343.         ENDIF
  15344.       ENDIF
  15345.       assemble_operands
  15346.       mnemonic$=bittest$(size%)
  15347.       operand$=register$(0,function%)+","+operand$
  15348.     ELSE
  15349.       sign$="$"
  15350.       displacement%=DPEEK(pc%+2)
  15351.       IF displacement%>&H7FFF
  15352.         displacement%=&H10000-displacement%
  15353.         sign$="-$"
  15354.       ENDIF
  15355.       displacement$=sign$+HEX$(displacement%)
  15356.       IF size%=0 OR size%=2
  15357.         mnemonic$="MOVEP.W"
  15358.       ELSE
  15359.         mnemonic$="MOVEP.L"
  15360.       ENDIF
  15361.       IF size%<2
  15362.         operand$=displacement$+register$(2,register%)+","+register$(0,function%)
  15363.       ELSE
  15364.         operand$=register$(0,function%)+","+displacement$+register$(2,register%)
  15365.       ENDIF
  15366.       INC d_offset%
  15367.     ENDIF
  15368.   ELSE
  15369.     check%=DPEEK(pc%)
  15370.     IF function%<4
  15371.       IF check%<>&H3C AND check%<>&H7C AND check%<>&H23C AND check%<>&H27C
  15372.         IF (dmode%=7 AND register%>1) OR (dmode%=1)
  15373.           CLR legal!
  15374.         ENDIF
  15375.       ENDIF
  15376.     ENDIF
  15377.     IF function%=0
  15378.       mnemonic$="ORI"
  15379.       immediate_addressing_two
  15380.       IF check%=&H7C
  15381.         operand$=operand$+" ; Privilege"
  15382.       ENDIF
  15383.     ENDIF
  15384.     IF function%=1
  15385.       mnemonic$="ANDI"
  15386.       immediate_addressing_two
  15387.       IF check%=&H27C
  15388.         operand$=operand$+" ; Privilege"
  15389.       ENDIF
  15390.     ENDIF
  15391.     IF function%=2
  15392.       mnemonic$="SUBI"
  15393.       immediate_addressing_three
  15394.     ENDIF
  15395.     IF function%=3
  15396.       mnemonic$="ADDI"
  15397.       immediate_addressing_three
  15398.     ENDIF
  15399.     IF function%=4
  15400.       INC extendflag%
  15401.       IF dmode%=7
  15402.         IF (size%=0 AND register%>3) OR (size%>0 AND register%>1)
  15403.           CLR legal!
  15404.         ENDIF
  15405.       ENDIF
  15406.       IF dmode%=1
  15407.         CLR legal!
  15408.       ENDIF
  15409.       IF dmode%=0
  15410.         IF PEEK(pc_memory%+3)>31
  15411.           CLR legal!
  15412.         ENDIF
  15413.       ELSE
  15414.         IF PEEK(pc_memory%+3)>7
  15415.           CLR legal!
  15416.         ENDIF
  15417.       ENDIF
  15418.       mnemonic$=bittest$(size%)
  15419.       CLR size%
  15420.       immediate_addressing_three
  15421.     ENDIF
  15422.     IF function%=5 OR function%=6
  15423.       IF check%<>&HA3C AND check%<>&HA7C
  15424.         IF (dmode%=7 AND register%>1) OR (dmode%=1)
  15425.           CLR legal!
  15426.         ENDIF
  15427.       ENDIF
  15428.       IF function%=5
  15429.         mnemonic$="EORI"
  15430.         immediate_addressing_two
  15431.         IF check%=&HA7C
  15432.           operand$=operand$+" ; Privilege"
  15433.         ENDIF
  15434.       ELSE
  15435.         mnemonic$="CMPI"
  15436.         immediate_addressing_three
  15437.       ENDIF
  15438.     ENDIF
  15439.     IF function%=7
  15440.       CLR legal!
  15441.     ENDIF
  15442.     IF extendflag%=0
  15443.       mnemonic$=mnemonic$+extend$(size%)
  15444.     ENDIF
  15445.   ENDIF
  15446.   SWAP pc%,pc_memory%
  15447. RETURN
  15448. PROCEDURE 1
  15449.   .| Glob. Var.: pc_memory%,pc%,size%,instruction%,dmode%,register%
  15450.   .|     operand_memory$,operand$,destination!,mnemonic$,d_offset%,legal!
  15451.   .|     trap%,fn%,a$
  15452.   .| Felder    : register$(),extend$(),gd$(),bi$(),xb$()
  15453.   .| Ruft auf  : assemble_operands
  15454.   .| Aufruf in : 68000_disassembler-3,
  15455.   ' * BEFEHLE DER GRUPPEN 1, 2 UND 3
  15456.   ' * ------------------------------
  15457.   ' * MOVE.B  : MOVE.W  : MOVE.L
  15458.   ' * MOVEA.W : MOVEA.L :
  15459.   pc_memory%=pc%
  15460.   size%=(instruction% AND 12288) DIV 4096
  15461.   IF size%=1
  15462.     DEC size%
  15463.   ENDIF
  15464.   IF size%=3
  15465.     SUB size%,2
  15466.   ENDIF
  15467.   dmode%=(instruction% AND 56) DIV 8
  15468.   register%=instruction% AND 7
  15469.   assemble_operands
  15470.   operand_memory$=operand$
  15471.   destination!=TRUE
  15472.   register%=(instruction% AND 3584) DIV 512
  15473.   dmode%=(instruction% AND 448) DIV 64
  15474.   IF dmode%=1
  15475.     operand$=register$(1,register%)
  15476.     mnemonic$="MOVEA"
  15477.   ELSE
  15478.     mnemonic$="MOVE"
  15479.     ADD pc%,d_offset%*2
  15480.     assemble_operands
  15481.     IF dmode%=7 AND register%>1
  15482.       CLR legal!
  15483.     ENDIF
  15484.   ENDIF
  15485.   operand$=operand_memory$+","+operand$
  15486.   mnemonic$=mnemonic$+extend$(size%)
  15487.   SWAP pc%,pc_memory%
  15488.   IF DPEEK(pc%)=&H3F3C
  15489.     ' MOVE.W #xx,-(sp)
  15490.     trap%=DPEEK(pc%+4)
  15491.     IF trap%>=&H4E40 AND trap%<=&H4E4F
  15492.       trap%=trap% AND 15
  15493.       fn%=DPEEK(pc%+2)
  15494.       CLR a$
  15495.       IF trap%=1 AND fn%<88
  15496.         a$=gd$(fn%)
  15497.       ELSE
  15498.         IF trap%=13 AND fn%<12
  15499.           a$=bi$(fn%)
  15500.         ELSE
  15501.           IF trap%=14 AND fn%<65
  15502.             a$=xb$(fn%)
  15503.           ENDIF
  15504.         ENDIF
  15505.       ENDIF
  15506.       operand$=operand$+" ; "+a$
  15507.     ENDIF
  15508.   ENDIF
  15509. RETURN
  15510. PROCEDURE 4
  15511.   .| Glob. Var.: bit_eight%,size%,dmode%,legal!,mnemonic$,operand$,function%
  15512.   .|     register%,registerlist$,instruction%,branch!,pc%,d_offset%,trap%
  15513.   .|     trap_number%,sign$,com$,displacement%,displacement$
  15514.   .| Felder    : register$(),extend$(),miscellaneous$(),trap$()
  15515.   .| Ruft auf  : isolate_single_bits,assemble_operands,assemble_registerlist
  15516.   .| Aufruf in : 68000_disassembler-1,
  15517.   ' * BEFEHLE DER GRUPPE 4
  15518.   ' * --------------------
  15519.   ' * CHK     : LEA          :      :          :       :       :
  15520.   ' * NEGX    : MOVE FROM SR : CLR  :          :       :       :
  15521.   ' * NEG     : MOVE TO CCR  :      :          :       :       :
  15522.   ' * NOT     : MOVE TO SR   :      :          :       :       :
  15523.   ' * NBCD    : SWAP         : PEA  : EXT      : MOVEM :       :
  15524.   ' * ILLEGAL : TAS          : TST  :          :       :       :
  15525.   ' * JSR     : JMP          :      :          :       :       :
  15526.   ' * RESET   : NOP          : stop : RTE      : RTS   : TRAPV : RTR
  15527.   ' * TRAP    : LINK         : UNLK : MOVE USP :       :       :
  15528.   isolate_single_bits
  15529.   IF bit_eight%=1
  15530.     IF size%=2
  15531.       DEC size%
  15532.       assemble_operands
  15533.       IF dmode%=1
  15534.         CLR legal!
  15535.       ENDIF
  15536.       mnemonic$="CHK"
  15537.       operand$=operand$+","+register$(0,function%)
  15538.     ELSE
  15539.       assemble_operands
  15540.       IF (dmode%<5 AND dmode%<>2) OR (dmode%=7 AND register%>3)
  15541.         CLR legal!
  15542.       ENDIF
  15543.       mnemonic$="LEA"
  15544.       operand$=operand$+","+register$(1,function%)
  15545.     ENDIF
  15546.   ELSE
  15547.     IF function%<2
  15548.       IF (dmode%=7 AND register%>1) OR dmode%=1
  15549.         CLR legal!
  15550.       ENDIF
  15551.     ENDIF
  15552.     IF function%=0
  15553.       assemble_operands
  15554.       IF size%<3
  15555.         mnemonic$="NEGX"+extend$(size%)
  15556.       ELSE
  15557.         mnemonic$="MOVE"
  15558.         operand$="SR,"+operand$
  15559.       ENDIF
  15560.     ENDIF
  15561.     IF function%=1
  15562.       assemble_operands
  15563.       mnemonic$="CLR"+extend$(size%)
  15564.     ENDIF
  15565.     IF function%=2
  15566.       assemble_operands
  15567.       IF size%<3
  15568.         IF (dmode%=7 AND register%>1) OR dmode%=1
  15569.           CLR legal!
  15570.         ENDIF
  15571.         mnemonic$="NEG"+extend$(size%)
  15572.       ELSE
  15573.         IF dmode%=1
  15574.           CLR legal!
  15575.         ENDIF
  15576.         mnemonic$="MOVE"
  15577.         operand$=operand$+",CCR"
  15578.       ENDIF
  15579.     ENDIF
  15580.     IF function%=3
  15581.       assemble_operands
  15582.       IF size%<3
  15583.         IF (dmode%=7 AND register%>1) OR dmode%=1
  15584.           CLR legal!
  15585.         ENDIF
  15586.         mnemonic$="NOT"+extend$(size%)
  15587.       ELSE
  15588.         IF dmode%=1
  15589.           CLR legal!
  15590.         ENDIF
  15591.         IF legal!
  15592.           mnemonic$="MOVE"
  15593.           operand$=operand$+",SR ; Privilege"
  15594.         ENDIF
  15595.       ENDIF
  15596.     ENDIF
  15597.     IF function%=4
  15598.       IF size%=0
  15599.         IF (dmode%=7 AND register%>1) OR dmode%=1
  15600.           CLR legal!
  15601.         ENDIF
  15602.         mnemonic$="NBCD"
  15603.         assemble_operands
  15604.       ENDIF
  15605.       IF size%=1
  15606.         IF dmode%=0
  15607.           mnemonic$="SWAP"
  15608.           operand$=register$(0,register%)
  15609.         ELSE
  15610.           IF (dmode%<5 AND dmode%<>2) OR (dmode%=7 AND register%>3)
  15611.             CLR legal!
  15612.           ENDIF
  15613.           mnemonic$="PEA"
  15614.           assemble_operands
  15615.         ENDIF
  15616.       ENDIF
  15617.       IF size%=2 OR size%=3
  15618.         SUB size%,1
  15619.         IF dmode%=0
  15620.           mnemonic$="EXT"+extend$(size%)
  15621.           operand$=register$(0,register%)
  15622.         ELSE
  15623.           IF (dmode%=7 AND register%>1) OR (dmode%<4 AND dmode%<>2)
  15624.             CLR legal!
  15625.           ENDIF
  15626.           mnemonic$="MOVEM"+extend$(size%)
  15627.           assemble_registerlist
  15628.           operand$=registerlist$+","+operand$
  15629.         ENDIF
  15630.       ENDIF
  15631.     ENDIF
  15632.     IF function%=5
  15633.       IF instruction%=&H4AFC
  15634.         mnemonic$="ILLEGAL"
  15635.       ELSE
  15636.         IF (dmode%=7 AND register%>1) OR dmode%=1
  15637.           CLR legal!
  15638.         ENDIF
  15639.         IF size%=3
  15640.           mnemonic$="TAS"
  15641.         ELSE
  15642.           mnemonic$="TST"+extend$(size%)
  15643.         ENDIF
  15644.         assemble_operands
  15645.       ENDIF
  15646.     ENDIF
  15647.     IF function%=6
  15648.       IF dmode%<5 AND dmode%<>2 AND dmode%<>3
  15649.         CLR legal!
  15650.       ENDIF
  15651.       IF size%=2
  15652.         mnemonic$="MOVEM.W"
  15653.       ELSE
  15654.         mnemonic$="MOVEM.L"
  15655.       ENDIF
  15656.       assemble_registerlist
  15657.       operand$=operand$+","+registerlist$
  15658.     ENDIF
  15659.     IF function%=7
  15660.       IF size%=2 OR size%=3
  15661.         IF (dmode%<5 AND dmode%<>2) OR (dmode%=7 AND register%>3)
  15662.           CLR legal!
  15663.         ENDIF
  15664.         assemble_operands
  15665.         IF size%=2
  15666.           mnemonic$="JSR"
  15667.         ELSE
  15668.           mnemonic$="JMP"
  15669.         ENDIF
  15670.         IF legal! AND mnemonic$="JMP"
  15671.           branch!=TRUE
  15672.         ENDIF
  15673.       ELSE
  15674.         IF dmode%=6
  15675.           IF register%=4
  15676.             CLR legal!
  15677.           ENDIF
  15678.           mnemonic$=miscellaneous$(register%)
  15679.           IF register%=0 OR register%=3
  15680.             operand$="; Privilege"
  15681.           ENDIF
  15682.           IF register%=2
  15683.             operand$="#$"+HEX$(DPEEK(pc%+2))+" ; Privilege"
  15684.             INC d_offset%
  15685.           ENDIF
  15686.           IF register%=2 OR register%=3 OR register%=5 OR register%=7
  15687.             branch!=TRUE
  15688.           ENDIF
  15689.         ELSE
  15690.           trap%=(instruction% AND 48) DIV 16
  15691.           IF trap%=0
  15692.             mnemonic$="TRAP"
  15693.             trap_number%=instruction% AND 15
  15694.             operand$="#$"+HEX$(trap_number%)
  15695.             IF trap_number%=2
  15696.               IF DPEEK(pc%-2)=&HC8
  15697.                 operand$=operand$+" ; AES"
  15698.               ELSE
  15699.                 IF (DPEEK(pc%-2) AND &H73)=&H73
  15700.                   operand$=operand$+" ; VDI"
  15701.                 ELSE
  15702.                   operand$=operand$+trap$(trap_number%)
  15703.                 ENDIF
  15704.               ENDIF
  15705.             ELSE
  15706.               operand$=operand$+trap$(trap_number%)
  15707.             ENDIF
  15708.             '
  15709.             '  Hier evtl TRAP-Aufrufe dekodieren
  15710.             '
  15711.           ELSE
  15712.             SUB dmode%,2
  15713.             IF dmode%=0
  15714.               sign$="$"
  15715.               CLR com$
  15716.               displacement%=DPEEK(pc%+2)
  15717.               IF displacement%>&H7FFF
  15718.                 displacement%=&H10000-displacement%
  15719.                 sign$="-$"
  15720.               ELSE
  15721.                 com$=" ; Nonstandard"
  15722.               ENDIF
  15723.               mnemonic$="LINK"
  15724.               displacement$=sign$+HEX$(displacement%)
  15725.               operand$=register$(1,register%)+",#"+displacement$+com$
  15726.               INC d_offset%
  15727.             ENDIF
  15728.             IF dmode%=1
  15729.               mnemonic$="UNLK"
  15730.               operand$=register$(1,register%)
  15731.             ENDIF
  15732.             IF dmode%=2 OR dmode%=3
  15733.               mnemonic$="MOVE"
  15734.               IF dmode%=2
  15735.                 operand$=register$(1,register%)+",USP ; Privilege"
  15736.               ELSE
  15737.                 operand$="USP,"+register$(1,register%)+" ; Privilege"
  15738.               ENDIF
  15739.             ENDIF
  15740.             IF dmode%>3
  15741.               CLR legal!
  15742.             ENDIF
  15743.           ENDIF
  15744.         ENDIF
  15745.       ENDIF
  15746.     ENDIF
  15747.   ENDIF
  15748. RETURN
  15749. PROCEDURE 5
  15750.   .| Glob. Var.: pc_memory%,pc%,dmode%,register%,legal!,size%,function%
  15751.   .|     operand$,bit_eight%,mnemonic$,conditioncode%,instruction%
  15752.   .|     destination%,drel%,destination$,d_offset%
  15753.   .| Felder    : extend$(),conditioncode$(),register$()
  15754.   .| Ruft auf  : isolate_single_bits,assemble_operands
  15755.   .| Aufruf in : 68000_disassembler-1,
  15756.   ' * BEFEHLE DER GRUPPE 5
  15757.   ' * ------------------------------------------
  15758.   ' * ADDQ : SUBQ
  15759.   ' * Scc  : cc=Bedingung=(cc.cs.eq.f.ge.gt.hi.le.ls.lt.mi.ne.pl.t.vc.vs)
  15760.   ' * DBRA : (Oder DBF)
  15761.   ' * DBcc : cc=Bedingung=(cc.cs.eq.f.ge.gt.hi.le.ls.lt.mi.ne.pl.t.vc.vs)
  15762.   pc_memory%=pc%
  15763.   isolate_single_bits
  15764.   IF dmode%=7 AND register%>1
  15765.     CLR legal!
  15766.   ENDIF
  15767.   IF size%<>3
  15768.     assemble_operands
  15769.     IF function%=0
  15770.       ADD function%,8
  15771.     ENDIF
  15772.     operand$="#$"+STR$(function%)+","+operand$
  15773.     IF bit_eight%=0
  15774.       mnemonic$="ADDQ"+extend$(size%)
  15775.     ELSE
  15776.       mnemonic$="SUBQ"+extend$(size%)
  15777.     ENDIF
  15778.   ELSE
  15779.     conditioncode%=(instruction% AND 3840) DIV 256
  15780.     IF dmode%<>1
  15781.       mnemonic$="S"+conditioncode$(conditioncode%)
  15782.       assemble_operands
  15783.     ELSE
  15784.       IF conditioncode%=1
  15785.         mnemonic$="DBRA"
  15786.       ELSE
  15787.         mnemonic$="DB"+conditioncode$(conditioncode%)
  15788.       ENDIF
  15789.       destination%=DPEEK(pc%+2)
  15790.       IF destination%>&H7FFF
  15791.         SUB destination%,&H10000
  15792.       ENDIF
  15793.       destination%=(pc%+2)+destination%-drel%
  15794.       destination$=HEX$(destination%)
  15795.       operand$=register$(0,register%)+",$"+destination$
  15796.       INC d_offset%
  15797.     ENDIF
  15798.   ENDIF
  15799. RETURN
  15800. PROCEDURE 6
  15801.   .| Glob. Var.: conditioncode%,instruction%,distance%,com$,mnemonic$,branch!
  15802.   .|     destination%,pc%,d_offset%,operand$,drel%
  15803.   .| Felder    : conditioncode$()
  15804.   .| Aufruf in : 68000_disassembler-1,
  15805.   ' * BEFEHLE DER GRUPPE 6
  15806.   ' * ------------------------------------------
  15807.   ' * BRA : BSR
  15808.   ' * Bcc : cc=Bedingung=(cc.cs.eq.ge.gt.hi.le.ls.lt.mi.ne.pl.vc.vs)
  15809.   conditioncode%=(instruction% AND 3840) DIV 256
  15810.   distance%=instruction% AND 255
  15811.   CLR com$
  15812.   IF conditioncode%<2
  15813.     IF conditioncode%=0
  15814.       mnemonic$="BRA"
  15815.       branch!=TRUE
  15816.     ELSE
  15817.       mnemonic$="BSR"
  15818.     ENDIF
  15819.   ELSE
  15820.     mnemonic$="B"+conditioncode$(conditioncode%)
  15821.   ENDIF
  15822.   IF distance%=0
  15823.     mnemonic$=mnemonic$+".W"
  15824.     destination%=DPEEK(pc%+2)
  15825.     IF (destination%>&HFF80) OR (destination%<&H80)
  15826.       com$=" ; (.W Could Be .S)"
  15827.     ENDIF
  15828.     IF destination%>&H7FFF
  15829.       SUB destination%,&H10000
  15830.     ENDIF
  15831.     INC d_offset%
  15832.   ELSE
  15833.     mnemonic$=mnemonic$+".S"
  15834.     IF distance%>&H7F
  15835.       SUB distance%,&H100
  15836.     ENDIF
  15837.     destination%=distance%
  15838.   ENDIF
  15839.   operand$="$"+HEX$((pc%+2)+destination%-drel%)+com$
  15840. RETURN
  15841. PROCEDURE 7
  15842.   .| Glob. Var.: mnemonic$,constant$,instruction%,register%,operand$
  15843.   .| Felder    : register$()
  15844.   .| Aufruf in : 68000_disassembler-1,
  15845.   ' * BEFEHLE DER GRUPPE 7
  15846.   ' * ------------------------------------------
  15847.   ' * MOVEQ
  15848.   mnemonic$="MOVEQ"
  15849.   constant$=HEX$(instruction% AND 255)
  15850.   register%=(instruction% AND 3584) DIV 512
  15851.   operand$="#$"+constant$+","+register$(0,register%)
  15852. RETURN
  15853. PROCEDURE 8
  15854.   .| Glob. Var.: size%,dmode%,legal!,operand$,function%,bit_eight%,mnemonic$
  15855.   .|     register%
  15856.   .| Felder    : register$(),extend$()
  15857.   .| Ruft auf  : isolate_single_bits,assemble_operands
  15858.   .| Aufruf in : 68000_disassembler-1,
  15859.   ' * BEFEHLE DER GRUPPE 8
  15860.   ' * ------------------------------------------
  15861.   ' * DIVU : DIVS
  15862.   ' * SBCD :
  15863.   ' * OR   :
  15864.   isolate_single_bits
  15865.   IF size%=3
  15866.     IF dmode%=1
  15867.       CLR legal!
  15868.     ENDIF
  15869.     assemble_operands
  15870.     operand$=operand$+","+register$(0,function%)
  15871.     IF bit_eight%=0
  15872.       mnemonic$="DIVU"
  15873.     ELSE
  15874.       mnemonic$="DIVS"
  15875.     ENDIF
  15876.   ELSE
  15877.     IF bit_eight%=1 AND dmode%<2
  15878.       mnemonic$="SBCD"
  15879.       IF dmode%=0
  15880.         operand$=register$(0,register%)+","+register$(0,function%)
  15881.       ELSE
  15882.         operand$=register$(4,register%)+","+register$(4,function%)
  15883.       ENDIF
  15884.     ELSE
  15885.       IF dmode%=1
  15886.         CLR legal!
  15887.       ENDIF
  15888.       assemble_operands
  15889.       mnemonic$="OR"+extend$(size%)
  15890.       IF bit_eight%=0
  15891.         operand$=operand$+","+register$(0,function%)
  15892.       ELSE
  15893.         operand$=register$(0,function%)+","+operand$
  15894.         IF dmode%=7 AND register%>1
  15895.           CLR legal!
  15896.         ENDIF
  15897.       ENDIF
  15898.     ENDIF
  15899.   ENDIF
  15900. RETURN
  15901. PROCEDURE 9
  15902.   .| Glob. Var.: instruction_group%,mnemonic$,size%,bit_eight%,operand$
  15903.   .|     function%,dmode%,register%,legal!
  15904.   .| Felder    : register$(),extend$()
  15905.   .| Ruft auf  : isolate_single_bits,assemble_operands
  15906.   .| Aufruf in : 68000_disassembler-2,
  15907.   ' * BEFEHLE DER GRUPPEN 9 UND 13
  15908.   ' * ------------------------------------------
  15909.   ' * SUBA : ADDA
  15910.   ' * SUBX : ADDX
  15911.   ' * SUB  : ADD
  15912.   IF instruction_group%=9
  15913.     mnemonic$="SUB"
  15914.   ELSE
  15915.     mnemonic$="ADD"
  15916.   ENDIF
  15917.   isolate_single_bits
  15918.   IF size%=3
  15919.     IF bit_eight%<>0
  15920.       DEC size%
  15921.     ENDIF
  15922.     assemble_operands
  15923.     operand$=operand$+","+register$(1,function%)
  15924.     IF bit_eight%=0
  15925.       mnemonic$=mnemonic$+"A.W"
  15926.     ELSE
  15927.       mnemonic$=mnemonic$+"A.L"
  15928.     ENDIF
  15929.   ELSE
  15930.     IF dmode%<2 AND bit_eight%=1
  15931.       mnemonic$=mnemonic$+"X"+extend$(size%)
  15932.       IF dmode%=0
  15933.         operand$=register$(0,register%)+","+register$(0,function%)
  15934.       ELSE
  15935.         operand$=register$(4,register%)+","+register$(4,function%)
  15936.       ENDIF
  15937.     ELSE
  15938.       assemble_operands
  15939.       IF bit_eight%=0
  15940.         operand$=operand$+","+register$(0,function%)
  15941.       ELSE
  15942.         operand$=register$(0,function%)+","+operand$
  15943.         IF dmode%=7 AND register%>1
  15944.           CLR legal!
  15945.         ENDIF
  15946.       ENDIF
  15947.       mnemonic$=mnemonic$+extend$(size%)
  15948.     ENDIF
  15949.   ENDIF
  15950. RETURN
  15951. PROCEDURE 10
  15952.   .| Glob. Var.: instruction%,mnemonic$,hexdump%,pc%,operand$,legal!
  15953.   .| Felder    : miscellaneous$(),linea$()
  15954.   .| Aufruf in : 68000_disassembler-1,
  15955.   ' * BEFEHLE DER GRUPPE 10
  15956.   ' * ------------------------------------------
  15957.   ' * KEINE. WERDEN MIT DC.W $Axxx (+ evt. LINEA VARIABLE) ÜBERSETZT
  15958.   ' *
  15959.   ' * FALLS ES SICH UM EINEN DER LINEA OPCODES HANDELT, WIRD DER NAME DES
  15960.   ' * OPCODES IN FORM EINES KOMMENTARS AN DEN OPERANDEN ANGEHÄNGT.
  15961.   ' *
  15962.   ' * Zb.   DC.W $A000 ; LINEA INIT.
  15963.   ' *
  15964.   ' * DIE WERTE VON $A000 BIS $A00F SIND BEIM ATARI ST DIE LINEA OPCODES
  15965.   IF instruction%<&HA010
  15966.     mnemonic$=miscellaneous$(4)
  15967.     hexdump%=DPEEK(pc%)
  15968.     operand$="$"+HEX$(hexdump%)+" ; "+linea$(PEEK(pc%+1))
  15969.   ELSE
  15970.     CLR legal!
  15971.   ENDIF
  15972. RETURN
  15973. PROCEDURE 11
  15974.   .| Glob. Var.: size%,bit_eight%,mnemonic$,operand$,function%,dmode%
  15975.   .|     register%,legal!
  15976.   .| Felder    : register$(),extend$()
  15977.   .| Ruft auf  : isolate_single_bits,assemble_operands
  15978.   .| Aufruf in : 68000_disassembler-1,
  15979.   ' * BEFEHLE DER GRUPPE 11
  15980.   ' * ------------------------------------------
  15981.   ' * CMPA : CMPM
  15982.   ' * EOR  : CMP
  15983.   isolate_single_bits
  15984.   IF size%=3 AND bit_eight%=1
  15985.     mnemonic$="CMPA.L"
  15986.     DEC size%
  15987.     assemble_operands
  15988.     operand$=operand$+","+register$(1,function%)
  15989.   ELSE
  15990.     IF bit_eight%=1
  15991.       IF dmode%=1
  15992.         mnemonic$="CMPM"+extend$(size%)
  15993.         operand$=register$(2,register%)+","+register$(2,function%)
  15994.       ELSE
  15995.         IF dmode%=7 AND register%>1
  15996.           CLR legal!
  15997.         ENDIF
  15998.         mnemonic$="EOR"+extend$(size%)
  15999.         assemble_operands
  16000.         operand$=register$(0,function%)+","+operand$
  16001.       ENDIF
  16002.     ELSE
  16003.       assemble_operands
  16004.       IF size%<3
  16005.         mnemonic$="CMP"+extend$(size%)
  16006.         operand$=operand$+","+register$(0,function%)
  16007.       ELSE
  16008.         mnemonic$="CMPA.W"
  16009.         operand$=operand$+","+register$(1,function%)
  16010.       ENDIF
  16011.     ENDIF
  16012.   ENDIF
  16013. RETURN
  16014. PROCEDURE 12
  16015.   .| Glob. Var.: size%,dmode%,legal!,bit_eight%,mnemonic$,operand$,function%
  16016.   .|     register%,d_register$
  16017.   .| Felder    : register$(),extend$()
  16018.   .| Ruft auf  : isolate_single_bits,assemble_operands
  16019.   .| Aufruf in : 68000_disassembler-1,
  16020.   ' * BEFEHLE DER GRUPPE 12
  16021.   ' * ------------------------------------------
  16022.   ' * MULU : MULS
  16023.   ' * ABCD : EXG
  16024.   ' * AND  :
  16025.   isolate_single_bits
  16026.   IF size%=3
  16027.     IF dmode%=1
  16028.       CLR legal!
  16029.     ENDIF
  16030.     IF bit_eight%=0
  16031.       mnemonic$="MULU"
  16032.     ELSE
  16033.       mnemonic$="MULS"
  16034.     ENDIF
  16035.     assemble_operands
  16036.     operand$=operand$+","+register$(0,function%)
  16037.   ELSE
  16038.     IF dmode%<2 AND bit_eight%=1
  16039.       IF size%=0
  16040.         mnemonic$="ABCD"
  16041.         IF dmode%=0
  16042.           operand$=register$(0,register%)+","+register$(0,function%)
  16043.         ELSE
  16044.           operand$=register$(4,register%)+","+register$(4,function%)
  16045.         ENDIF
  16046.       ELSE
  16047.         mnemonic$="EXG"
  16048.         IF size%=1 AND dmode%=0
  16049.           operand$=register$(0,function%)+","+register$(0,register%)
  16050.         ENDIF
  16051.         IF size%=2
  16052.           operand$=register$(0,function%)+","+register$(1,register%)
  16053.         ENDIF
  16054.         IF size%<>2 AND dmode%<>0
  16055.           operand$=register$(1,function%)+","+register$(1,register%)
  16056.         ENDIF
  16057.       ENDIF
  16058.     ELSE
  16059.       IF dmode%=1
  16060.         CLR legal!
  16061.       ENDIF
  16062.       mnemonic$="AND"+extend$(size%)
  16063.       assemble_operands
  16064.       d_register$="D"+STR$(function%)   ! ##### wird nirgens verwendet
  16065.       IF bit_eight%=0
  16066.         operand$=operand$+","+register$(0,function%)
  16067.       ELSE
  16068.         IF (dmode%=7 AND register%>1)
  16069.           CLR legal!
  16070.         ENDIF
  16071.         operand$=register$(0,function%)+","+operand$
  16072.       ENDIF
  16073.     ENDIF
  16074.   ENDIF
  16075. RETURN
  16076. PROCEDURE 14
  16077.   .| Glob. Var.: instruction%,shift_direction$,size%,shift%,mnemonic$,counter%
  16078.   .|     function%,operand$,register%,dmode%,legal!
  16079.   .| Felder    : arithmetic_shift$(),extend$(),register$()
  16080.   .| Ruft auf  : isolate_single_bits,assemble_operands
  16081.   .| Aufruf in : 68000_disassembler-1,
  16082.   ' * BEFEHLE DER GRUPPE 14
  16083.   ' * ------------------------------------------
  16084.   ' * ASL : ASR :      :
  16085.   ' * ROL : ROR : ROXL : ROXR
  16086.   isolate_single_bits
  16087.   IF (instruction% AND 256) DIV 256=1
  16088.     shift_direction$="L"
  16089.   ELSE
  16090.     shift_direction$="R"
  16091.   ENDIF
  16092.   IF size%=3
  16093.     shift%=(instruction% AND 1536) DIV 512
  16094.   ELSE
  16095.     shift%=(instruction% AND 24) DIV 8
  16096.   ENDIF
  16097.   mnemonic$=arithmetic_shift$(shift%)+shift_direction$+extend$(size%)
  16098.   IF size%<3
  16099.     counter%=function%
  16100.     IF (instruction% AND 32) DIV 32=0
  16101.       IF counter%=0
  16102.         ADD counter%,8
  16103.       ENDIF
  16104.       operand$="#$"+STR$(counter%)
  16105.     ELSE
  16106.       operand$=register$(0,function%)
  16107.     ENDIF
  16108.     operand$=operand$+","+register$(0,register%)
  16109.   ELSE
  16110.     assemble_operands
  16111.     IF (dmode%=7 AND register%>1) OR dmode%<2
  16112.       CLR legal!
  16113.     ENDIF
  16114.   ENDIF
  16115. RETURN
  16116. PROCEDURE 15
  16117.   .| Glob. Var.: legal!
  16118.   .| Aufruf in : 68000_disassembler-1,
  16119.   ' * BEFEHLE DER GRUPPE 15
  16120.   ' * ------------------------------------------
  16121.   ' * KEINE. WERDEN MIT DC.W $Fxxx ÜBERSETZT.
  16122.   CLR legal!
  16123. RETURN
  16124. PROCEDURE assemble_operands
  16125.   .| Glob. Var.: dmode%,operand$,register%,displacement%,pc%,sign$
  16126.   .|     displacement$,d_offset%,reg%,ext%,reg$,ext$,index$,instruction_group%
  16127.   .|     pc_memory%,destination!,drel%,legal!
  16128.   .| Felder    : register$()
  16129.   .| Ruft auf  : immediate_addressing_one
  16130.   .| Aufruf in : 0-1,1-2,4-10,5-2,8-2,9-2,11-3,12-2,14-1
  16131.   .|     assemble_registerlist-1,immediate_addressing_two-1
  16132.   .|     immediate_addressing_three-1,
  16133.   IF dmode%<7
  16134.     IF dmode%<5
  16135.       ' *   Dn   : DATENREGISTER DIREKT
  16136.       ' *   An   : ADRESSREGISTER DIREKT
  16137.       ' *  (An)  : ADRESSREGISTER INDIREKT
  16138.       ' *  (An)+ : ADRESSREGISTER INDIREKT MIT POSTINKREMENT
  16139.       ' * -(An)  : ADRESSREGISTER INDIREKT MIT PREDEKREMENT
  16140.       operand$=register$(dmode%,register%)
  16141.     ELSE
  16142.       IF dmode%=5
  16143.         ' * d16(An) : ADRESSREGISTER INDIREKT MIT ADRESSDISTANZ
  16144.         displacement%=DPEEK(pc%+2)
  16145.         IF displacement%<>0
  16146.           sign$="$"
  16147.           IF displacement%>&H7FFF
  16148.             displacement%=&H10000-displacement%
  16149.             sign$="-$"
  16150.           ENDIF
  16151.           displacement$=sign$+HEX$(displacement%)
  16152.         ELSE
  16153.           CLR displacement$
  16154.         ENDIF
  16155.         operand$=displacement$+register$(2,register%)
  16156.         INC d_offset%
  16157.       ELSE
  16158.         ' * d8(An,Rx.X) : ADRESSREGISTER INDIREKT MIT INDEX + ADRESSDISTANZ
  16159.         reg%=PEEK(pc%+2)
  16160.         ext%=reg%
  16161.         IF (reg% AND 128) DIV 128=1
  16162.           reg$="A"
  16163.         ELSE
  16164.           reg$="D"
  16165.         ENDIF
  16166.         IF (ext% AND 8) DIV 8=1
  16167.           ext$=".L"
  16168.         ELSE
  16169.           ext$=".W"
  16170.         ENDIF
  16171.         index$=reg$+STR$((reg% AND 112) DIV 16)+ext$
  16172.         displacement%=PEEK(pc%+3)
  16173.         IF displacement%<>0
  16174.           sign$="$"
  16175.           IF displacement%>&H7F
  16176.             displacement%=&H100-displacement%
  16177.             sign$="-$"
  16178.           ENDIF
  16179.           displacement$=sign$+HEX$(displacement%)
  16180.         ELSE
  16181.           CLR displacement$
  16182.         ENDIF
  16183.         reg%=(PEEK(pc%+1) AND 7)
  16184.         IF instruction_group%=0
  16185.           reg%=(PEEK(pc_memory%+1) AND 7)
  16186.         ENDIF
  16187.         IF destination!
  16188.           IF instruction_group%>0 AND instruction_group%<4
  16189.             reg%=((PEEK(pc_memory%) AND 14) DIV 2)
  16190.           ENDIF
  16191.         ENDIF
  16192.         operand$=displacement$+"("+register$(1,reg%)+","+index$+")"
  16193.         INC d_offset%
  16194.       ENDIF
  16195.     ENDIF
  16196.   ELSE
  16197.     IF register%=0
  16198.       ' * $xxxx : ABSOLUT KURZ
  16199.       operand$="$"+HEX$(DPEEK(pc%+2))
  16200.       INC d_offset%
  16201.     ENDIF
  16202.     IF register%=1
  16203.       ' * $xxxxxxxx: ABSOLUT LANG
  16204.       operand$="$"+HEX$(LPEEK(pc%+2))
  16205.       ADD d_offset%,2
  16206.     ENDIF
  16207.     IF register%=2
  16208.       ' * d16(PC) : PROGRAMMZÄHLERRELATIV MIT ADRESSDISTANZ
  16209.       displacement%=DPEEK(pc%+2)
  16210.       IF displacement%>&H7FFF
  16211.         SUB displacement%,&H10000
  16212.       ENDIF
  16213.       displacement$=HEX$((pc%+2)+displacement%-drel%)
  16214.       operand$="$"+displacement$+"(PC)"
  16215.       INC d_offset%
  16216.     ENDIF
  16217.     IF register%=3
  16218.       ' * d8(PC,Rx.X) : PROGRAMMZÄHLERRELATIV MIT INDEX + ADRESSDISTANZ
  16219.       reg%=PEEK(pc%+2)
  16220.       ext%=reg%
  16221.       IF (reg% AND 128) DIV 128=1
  16222.         reg$="A"
  16223.       ELSE
  16224.         reg$="D"
  16225.       ENDIF
  16226.       IF (ext% AND 8) DIV 8=1
  16227.         ext$=".L"
  16228.       ELSE
  16229.         ext$=".W"
  16230.       ENDIF
  16231.       index$=reg$+STR$((reg% AND 112) DIV 16)+ext$
  16232.       displacement%=PEEK(pc%+3)
  16233.       IF displacement%>&H7F
  16234.         SUB displacement%,&H100
  16235.       ENDIF
  16236.       displacement$=HEX$((pc%+2)+displacement%-drel%)
  16237.       operand$="$"+displacement$+"(PC,"+index$+")"
  16238.       INC d_offset%
  16239.     ENDIF
  16240.     IF register%=4
  16241.       immediate_addressing_one
  16242.     ENDIF
  16243.     IF register%>4
  16244.       CLR legal!
  16245.     ENDIF
  16246.   ENDIF
  16247. RETURN
  16248. PROCEDURE assemble_registerlist
  16249.   .| Glob. Var.: high$,low$,registerlist$,d_registerbyte%,a_registerbyte%
  16250.   .|     dmode%,highbyte$,n$,pc%,lowbyte$,i%,first_position%,last_position%
  16251.   .|     d_offset%,pc_memory%
  16252.   .| Felder    : register$()
  16253.   .| Ruft auf  : assemble_operands
  16254.   .| Aufruf in : 4-2,
  16255.   ' * zb. MOVEM.L D0-D7/A0-A6,-(SP)
  16256.   CLR high$,low$,registerlist$
  16257.   d_registerbyte%=3
  16258.   a_registerbyte%=2
  16259.   IF dmode%=4
  16260.     SWAP d_registerbyte%,a_registerbyte%
  16261.   ENDIF
  16262.   highbyte$=RIGHT$(n$+BIN$(PEEK(pc%+d_registerbyte%)),8)
  16263.   lowbyte$=RIGHT$(n$+BIN$(PEEK(pc%+a_registerbyte%)),8)
  16264.   IF dmode%<>4
  16265.     FOR i%=8 DOWNTO 1
  16266.       high$=high$+MID$(highbyte$,i%,1)
  16267.       low$=low$+MID$(lowbyte$,i%,1)
  16268.     NEXT i%
  16269.     SWAP highbyte$,high$
  16270.     SWAP lowbyte$,low$
  16271.   ENDIF
  16272.   highbyte$=highbyte$+"0"
  16273.   lowbyte$=lowbyte$+"0"
  16274.   FOR first_position%=0 TO 7
  16275.     last_position%=first_position%
  16276.     IF MID$(highbyte$,first_position%+1,1)="1"
  16277.       DO
  16278.         INC last_position%
  16279.         EXIT IF MID$(highbyte$,last_position%+1,1)="0"
  16280.       LOOP
  16281.       IF last_position%-first_position%=1
  16282.         registerlist$=registerlist$+register$(0,first_position%)+"/"
  16283.       ELSE
  16284.         registerlist$=registerlist$+register$(0,first_position%)
  16285.         registerlist$=registerlist$+"-"+register$(0,last_position%-1)+"/"
  16286.       ENDIF
  16287.       first_position%=last_position%-1
  16288.     ENDIF
  16289.   NEXT first_position%
  16290.   FOR first_position%=0 TO 7
  16291.     last_position%=first_position%
  16292.     IF MID$(lowbyte$,first_position%+1,1)="1"
  16293.       DO
  16294.         INC last_position%
  16295.         EXIT IF MID$(lowbyte$,last_position%+1,1)="0"
  16296.       LOOP
  16297.       IF last_position%-first_position%=1
  16298.         registerlist$=registerlist$+register$(1,first_position%)+"/"
  16299.       ELSE
  16300.         registerlist$=registerlist$+register$(1,first_position%)
  16301.         registerlist$=registerlist$+"-"+register$(1,last_position%-1)+"/"
  16302.       ENDIF
  16303.       first_position%=last_position%-1
  16304.     ENDIF
  16305.   NEXT first_position%
  16306.   registerlist$=LEFT$(registerlist$,LEN(registerlist$)-1)
  16307.   INC d_offset%
  16308.   pc_memory%=pc%
  16309.   ADD pc%,d_offset%*2
  16310.   assemble_operands
  16311.   SWAP pc%,pc_memory%
  16312. RETURN
  16313. PROCEDURE immediate_addressing_one
  16314.   .| Glob. Var.: size%,operand$,pc%,d_offset%
  16315.   .| Aufruf in : assemble_operands-1,immediate_addressing_two-1
  16316.   .|     immediate_addressing_three-1,
  16317.   IF size%=0
  16318.     ' * #$xx       : BYTE-KONSTANTENADRESSIERUNG
  16319.     operand$="#$"+HEX$(PEEK(pc%+3))
  16320.   ENDIF
  16321.   IF size%=1 OR size%=3
  16322.     ' * #$xxxx     : WORT-KONSTANTENADRESSIERUNG
  16323.     operand$="#$"+HEX$(DPEEK(pc%+2))
  16324.   ENDIF
  16325.   IF size%=2
  16326.     ' * #$xxxxxxxx : LANGWORT-KONSTANTENADRESSIERUNG
  16327.     operand$="#$"+HEX$(LPEEK(pc%+2))
  16328.     INC d_offset%
  16329.   ENDIF
  16330.   INC d_offset%
  16331. RETURN
  16332. PROCEDURE immediate_addressing_two
  16333.   .| Glob. Var.: operand_memory$,operand$,pc%,d_offset%,status_register%
  16334.   .|     extendflag%,size%,status_register$,legal!
  16335.   .| Ruft auf  : immediate_addressing_one,assemble_operands
  16336.   .| Aufruf in : 0-3,
  16337.   ' * #$xx/#$xxxx/#$xxxxxxxx,<EA> : KONSTANTENADRESSIERUNG,<EA>
  16338.   immediate_addressing_one
  16339.   operand_memory$=operand$+","
  16340.   ADD pc%,d_offset%*2
  16341.   IF status_register%<>60
  16342.     assemble_operands
  16343.     operand$=operand_memory$+operand$
  16344.   ELSE
  16345.     ' * SR/CCR : STATUSREGISTER DIREKT
  16346.     INC extendflag%
  16347.     IF size%=0
  16348.       status_register$="CCR"
  16349.     ELSE
  16350.       IF legal!
  16351.         status_register$="SR"
  16352.       ENDIF
  16353.     ENDIF
  16354.     operand$=operand_memory$+status_register$
  16355.   ENDIF
  16356. RETURN
  16357. PROCEDURE immediate_addressing_three
  16358.   .| Glob. Var.: operand_memory$,operand$,pc%,d_offset%
  16359.   .| Ruft auf  : immediate_addressing_one,assemble_operands
  16360.   .| Aufruf in : 0-4,
  16361.   ' * #$xx/#$xxxx/#$xxxxxxxx,<EA> : KONSTANTENADRESSIERUNG,<EA>
  16362.   immediate_addressing_one
  16363.   operand_memory$=operand$+","
  16364.   ADD pc%,d_offset%*2
  16365.   assemble_operands
  16366.   operand$=operand_memory$+operand$
  16367. RETURN
  16368. PROCEDURE isolate_single_bits
  16369.   .| Glob. Var.: function%,instruction%,bit_eight%,size%,dmode%,register%
  16370.   .| Aufruf in : 0-1,4-1,5-1,8-1,9-1,11-1,12-1,14-1,
  16371.   ' * Function% = BIT 11-9 : Bit_eight% = BIT   8 : Size% = BIT 7-6
  16372.   ' * Dmode%    = BIT  5-3 : Register%  = BIT 2-0
  16373.   function%=(instruction% AND 3584) DIV 512
  16374.   bit_eight%=(instruction% AND 256) DIV 256
  16375.   size%=(instruction% AND 192) DIV 64
  16376.   dmode%=(instruction% AND 56) DIV 8
  16377.   register%=instruction% AND 7
  16378. RETURN
  16379. PROCEDURE initiate_68000_disassembler
  16380.   .| Glob. Var.: dis_init%,index%,dmode%,register%
  16381.   .| Felder    : arithmetic_shift$(),extend$(),bittest$(),conditioncode$()
  16382.   .|     trap$(),linea$(),miscellaneous$(),gd$(),xb$(),bi$(),register$()
  16383.   .| Aufruf in : 68000_disassembler-1,
  16384.   ' * DIESE ROUTINE WIRD NUR EINMAL BEIM START DURCHGEFÜHRT
  16385.   dis_init%=1
  16386.   DIM arithmetic_shift$(3),extend$(3),bittest$(3)
  16387.   DIM conditioncode$(15),trap$(15),linea$(15),miscellaneous$(7)
  16388.   DIM gd$(92),xb$(87),bi$(11)
  16389.   DIM register$(4,7)
  16390.   RESTORE 68000_disassembler_data
  16391.   FOR index%=0 TO 3
  16392.     READ arithmetic_shift$(index%)
  16393.     READ extend$(index%)
  16394.     READ bittest$(index%)
  16395.   NEXT index%
  16396.   FOR index%=0 TO 15
  16397.     READ conditioncode$(index%)
  16398.     READ trap$(index%)
  16399.     READ linea$(index%)
  16400.   NEXT index%
  16401.   FOR index%=0 TO 11
  16402.     READ bi$(index%)            ! BIOS
  16403.   NEXT index%
  16404.   FOR index%=0 TO 87
  16405.     READ xb$(index%)            ! XBIOS
  16406.   NEXT index%
  16407.   FOR index%=0 TO 92
  16408.     READ gd$(index%)            ! GEMDOS
  16409.   NEXT index%
  16410.   FOR index%=0 TO 7
  16411.     READ miscellaneous$(index%)
  16412.   NEXT index%
  16413.   FOR dmode%=0 TO 4
  16414.     FOR register%=0 TO 7
  16415.       READ register$(dmode%,register%)
  16416.     NEXT register%
  16417.   NEXT dmode%
  16418.   '
  16419. 68000_disassembler_data:
  16420.   ' * Arithmetic_shift$() + Extend$() + Bittest$()
  16421.   DATA AS,.B,BTST,LS,.W,BCHG,ROX,.L,BCLR,RO,.W,BSET
  16422.   ' * Conditioncode$()    + Trap$()   + Linea$()
  16423.   DATA T,,LINE-A Init,F, ; Gemdos,Put Pixel,HI, ; VDI/AES,Get Pixel,LS,
  16424.   DATA Line,CC,,Horizontal Line,CS,,Filled Rectangle,NE,,Filled Polygon
  16425.   DATA EQ,,Bitblt,VC,,Textblt,VS,,Show Mouse,PL,,Hide Cursor,MI,
  16426.   DATA Transform Mouse,GE,,Undraw Sprite,LT, ; Bios,Draw Sprite
  16427.   DATA GT, ; Xbios,Copy Raster Form,LE,,Seedfill
  16428.   ' Bios-Funktionen
  16429.   DATA Getmpb,Bconstat,Bconin,Bconout,Rwabs,Setexc,Tickcal,Getbpb,Bcostat
  16430.   DATA Mediach,Drvmap,Kbshift
  16431.   ' Xbios-Funktionen
  16432.   DATA Initmous,Ssbrk,Physbase,Logbase,Getrez,Setscreen,Setpalette
  16433.   DATA Setcolor,Floprd,Flopwr,Flopfmt,Getdsb,Midiws,Mfpint,Iorec
  16434.   DATA Rsconf,Keytbl,Random,Protobt,Flopver,Scrdmp,Cursconf
  16435.   DATA Settime,Gettime,Bioskeys,Ikbdws,Jdisint,Jenabint
  16436.   DATA Giaccess,Offgibit,Ongibit,Xbtimer,Dosound,Setprt,Kbdvbase
  16437.   DATA Kbrate,Prtblk,Vsync,Supexec,Puntaes,40,Floprate,DMAread,DMAwrite,Bconmap
  16438.   DATA 45,NVMaccess,47,Metainit,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
  16439.   DATA Blitmode,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,EsetShift
  16440.   DATA EgetShift,EsetBank,EsetColor,EsetPalette,EgetPalette,EsetGray,EsetSmear
  16441.   ' Gemdos-Funktionen
  16442.   DATA Pterm0,Cconin,Cconout,Cauxin,Cauxout,Cprnout,Crawio,Crawcin
  16443.   DATA Cnecin,Cconws,Cconrs,Cconis,12,13,Dsetdrv,15,Cconos,Cprnos
  16444.   DATA Cauxis,Cauxos,20,21,22,23,24,Dgetdrv,Fsetdta,27,28,29,30,31
  16445.   DATA Super,33,34,35,36,37,38,39,40,41
  16446.   DATA Tgetdate,Tsetdate,Tgettime,Tsettime,46,Fgetdta,Sversion
  16447.   DATA Ptermres,50,51,52,53,Dfree,55,56,Dcreate,Ddelete,Dsetpath
  16448.   DATA Fcreate,Fopen,Fclose,Fread,Fwrite,Fdelete,Fseek,Fattrib
  16449.   DATA 68,Fdup,Fforce,Dgetpath,Malloc,Mfree,Mshrink,Pexec
  16450.   DATA Pterm,77,Fsfirst,Fsnext,80,81,82,83,84,85,Frename,Fdatime
  16451.   DATA 88,89,90,91,Flock
  16452.   ' * Miscellaneous$()
  16453.   DATA RESET,NOP,STOP,RTE,DC.W,RTS,TRAPV,RTR
  16454.   ' * Register$(,)
  16455.   DATA D0,D1,D2,D3,D4,D5,D6,D7
  16456.   DATA A0,A1,A2,A3,A4,A5,A6,SP
  16457.   DATA (A0),(A1),(A2),(A3),(A4),(A5),(A6),(SP)
  16458.   DATA (A0)+,(A1)+,(A2)+,(A3)+,(A4)+,(A5)+,(A6)+,(SP)+
  16459.   DATA -(A0),-(A1),-(A2),-(A3),-(A4),-(A5),-(A6),-(SP)
  16460. RETURN
  16461. '
  16462. PROCEDURE init_ram
  16463.   .| Glob. Var.: utis%,zeile%,root.raw%,boot.raw%,locksley%,scsi%,mdisk%
  16464.   .|     mtasse%,ihd_err%,ihd_tab%,hh_max%,flp_err%,flp_tab%,default%,mes_adr%
  16465.   .|     scsi_komm%,com_blk%,flo_com%,vdi_par%,z_buf%,fdc1%,fdc2%,fdc3%
  16466.   .|     trk_len_max%,buf_size%,init_mem%,buf%,ver$,undo_buf%,ak%,buf2%
  16467.   .|     fat_size%,fatbuf%
  16468.   .| Felder    : inl_tab%(),inl_dat%(),w_titel%()
  16469.   .| Ruft auf  : alrt,clear_buf
  16470.   .| Aufruf in : HAUPTPROGRAMM-1,
  16471. ' ## INLINE:
  16472. ' $0000: 3c 2f 00 04 28 6f 00 06 2a 6f 00 0a 28 2f 00 0e 
  16473. ' $0010: 2a 2f 00 12 30 06 c0 bc 00 00 ff 00 ee 80 47 fa 
  16474. ' $0020: 00 0e 30 33 00 fe 47 fa ff d8 4e f3 00 00 00 4a 
  16475. ' $0030: 01 32 01 5a 01 78 01 a0 01 ae 01 32 01 f2 2f 08 
  16476. ' $0040: 3f 3c 00 26 4e 4e 5c 8f 4e 75 cc 7c 00 ff 30 06 
  16477. ' $0050: 41 fa 00 de 30 86 d0 3c 00 41 41 fa 00 d0 10 80 
  16478. ' $0060: 41 fa 00 18 61 d8 42 67 48 7a 00 c2 3f 3c 00 4e 
  16479. ' $0070: 4e 41 50 8f 41 fa 00 36 60 c4 41 fa 00 56 20 b8 
  16480. ' $0080: 04 72 41 fa 00 70 20 b8 04 7e 41 fa 00 88 20 b8 
  16481. ' $0090: 04 76 41 fa 00 42 21 c8 04 72 41 fa 00 5c 21 c8 
  16482. ' $00a0: 04 7e 41 fa 00 74 21 c8 04 76 4e 75 41 fa 00 28 
  16483. ' $00b0: b1 f8 04 72 66 12 21 fa 00 1a 04 72 21 fa 00 36 
  16484. ' $00c0: 04 7e 21 fa 00 50 04 76 4e 75 58 42 52 41 43 42 
  16485. ' $00d0: 53 44 00 01 e3 42 30 3a 00 58 b0 6f 00 04 66 06 
  16486. ' $00e0: 61 ca 70 00 4e 75 20 7a ff ea 4e d0 58 42 52 41 
  16487. ' $00f0: 43 42 53 44 00 01 e4 02 30 3a 00 36 b0 6f 00 04 
  16488. ' $0100: 66 04 70 02 4e 75 20 7a ff ec 4e d0 58 42 52 41 
  16489. ' $0110: 43 42 53 44 00 06 72 80 30 3a 00 16 b0 6f 00 0e 
  16490. ' $0120: 66 04 70 f2 4e 75 20 7a ff ec 4e d0 48 3a 5c 00 
  16491. ' $0130: 00 07 70 00 72 00 74 00 bc 7c 02 00 67 02 74 01 
  16492. ' $0140: 32 1c e0 59 4a 42 66 06 4a 41 66 08 60 04 b2 84 
  16493. ' $0150: 6b 02 52 80 bb cc 6a e8 4e 75 20 0d 74 07 cc 7c 
  16494. ' $0160: 00 ff 67 0a 05 f4 00 00 51 c8 ff fa 4e 75 05 b4 
  16495. ' $0170: 00 00 51 c8 ff fa 4e 75 20 4c 20 0d 34 04 16 18 
  16496. ' $0180: e1 4b b7 42 72 07 36 02 d4 42 c6 7c 80 00 67 04 
  16497. ' $0190: 0a 42 10 21 51 c9 ff f0 53 80 66 e2 30 02 4e 75 
  16498. ' $01a0: bb 8c 56 cc ff fc 4a 44 5a c0 48 80 4e 75 41 fa 
  16499. ' $01b0: 00 0e 26 4d 61 00 fe 88 20 3a 00 34 4e 75 41 fa 
  16500. ' $01c0: 00 2e 50 d0 41 fa 00 24 43 f8 00 08 20 91 41 fa 
  16501. ' $01d0: 00 12 22 88 24 4f 16 dc 51 cc ff fc 41 fa 00 10 
  16502. ' $01e0: 42 90 2e 4a 22 ba 00 04 4e 75 00 0a e9 1a 00 00 
  16503. ' $01f0: 00 00 41 fa 00 08 26 4d 60 00 fe 44 70 0c 20 4c 
  16504. ' $0200: 12 04 4e 93 28 45 28 c9 28 c0 28 c8 28 ca 4e 75 
  16505. ' $0210: 00 00 
  16506. ' 530  Bytes.
  16507.   INLINE utis%,530
  16508. ' ## INLINE:
  16509. ' $0000: 4e 56 00 00 48 e7 ff fc 41 fa 06 36 b1 fa 06 1e 
  16510. ' $0010: 67 18 4b fa 06 18 43 fa 06 40 45 fa 08 3c 47 fa 
  16511. ' $0020: 0a 38 49 fa 0c 34 48 d5 1f 00 2a 6e 00 0a 24 6d 
  16512. ' $0030: 00 00 3a 2e 00 10 34 2e 00 14 41 fa 05 de 30 ae 
  16513. ' $0040: 00 0e 41 fa 05 da 30 2e 00 12 67 46 30 80 30 2e 
  16514. ' $0050: 00 08 b0 7c 00 01 67 00 03 44 26 6d 00 04 28 2d 
  16515. ' $0060: 00 08 41 fa 05 b8 30 2e 00 16 30 80 6a 00 04 16 
  16516. ' $0070: 53 42 66 04 61 24 60 1a 2f 02 61 1e 24 1f da 6d 
  16517. ' $0080: 00 0e 50 44 50 44 45 ea 00 10 47 eb 00 10 51 ca 
  16518. ' $0090: ff e8 4c df 3f ff 4e 5e 4e 75 41 fa 05 7c 30 ba 
  16519. ' $00a0: 05 7a 49 fa 05 b4 61 00 03 4a 38 fc 00 20 61 00 
  16520. ' $00b0: 03 aa 38 fc 00 20 61 6c 61 00 04 9c 61 00 00 8a 
  16521. ' $00c0: 61 00 00 ea 30 3a 05 46 6b 58 61 00 02 36 49 fa 
  16522. ' $00d0: 05 40 3c 1c 30 06 43 fa 05 46 b0 51 6a 2c 61 34 
  16523. ' $00e0: 32 1c b2 51 6b 02 32 11 92 46 61 00 02 3e 3c 1c 
  16524. ' $00f0: 30 06 43 fa 05 2a b0 51 6a 10 61 18 32 1c b2 51 
  16525. ' $0100: 6b 02 32 11 92 46 61 00 02 22 61 00 01 fa 70 00 
  16526. ' $0110: 60 00 02 50 c0 ed 00 10 d0 7a 05 00 41 fa 04 fa 
  16527. ' $0120: 30 80 4e 75 20 4a 74 0f 70 00 10 18 61 08 38 c0 
  16528. ' $0130: 51 ca ff f8 4e 75 b0 6d 00 12 6b 08 b0 6d 00 14 
  16529. ' $0140: 67 04 6b 02 70 20 4e 75 70 07 72 ff 43 fa 04 be 
  16530. ' $0150: 32 81 72 00 20 4b 01 18 66 0a 52 41 b2 7c 00 10 
  16531. ' $0160: 66 f4 60 14 32 81 43 fa 04 a6 52 41 b2 7c 00 10 
  16532. ' $0170: 67 04 01 18 66 f4 32 81 43 fa 04 96 32 3a 04 8e 
  16533. ' $0180: 30 01 d2 41 d2 40 d2 7c 00 09 32 c1 32 3a 04 80 
  16534. ' $0190: 30 01 d2 41 d2 40 50 41 32 c1 70 3a 32 00 d0 7a 
  16535. ' $01a0: 04 6c 32 c0 d2 7a 04 68 32 c1 4e 75 10 3a 04 2e 
  16536. ' $01b0: 6a 0a 72 4a 61 00 01 04 60 00 01 1c 48 e7 e0 38 
  16537. ' $01c0: 49 fa 04 6a 47 fa 04 5e 26 ac 00 04 47 fa 04 2e 
  16538. ' $01d0: 45 fa 04 0a 72 3a 61 00 00 e2 34 01 67 64 72 00 
  16539. ' $01e0: 12 1a 6b 36 48 e7 e0 38 61 00 00 ec 4c df 1c 07 
  16540. ' $01f0: d3 ac 00 04 d3 ac 00 04 94 41 6f 00 00 aa c2 ed 
  16541. ' $0200: 00 10 41 fa 04 14 d3 50 70 00 10 1b 48 e7 e0 38 
  16542. ' $0210: 61 00 01 50 4c df 1c 07 60 c4 4a 42 6f 24 32 02 
  16543. ' $0220: 48 e7 e0 38 61 00 00 b0 4c df 1c 07 d3 ac 00 04 
  16544. ' $0230: d3 ac 00 04 94 41 6b 6e c2 ed 00 10 41 fa 03 da 
  16545. ' $0240: d3 50 70 00 61 00 01 1c 45 fa 03 d4 04 52 00 3a 
  16546. ' $0250: 72 10 61 66 06 52 00 3a 34 01 67 50 47 fa 03 9e 
  16547. ' $0260: 45 fa 03 8a 72 00 12 1a 6b 34 67 20 48 e7 e0 38 
  16548. ' $0270: 61 64 4c df 1c 07 d3 ac 00 04 d3 ac 00 04 94 41 
  16549. ' $0280: 6f 24 c2 ed 00 10 41 fa 03 90 d3 50 70 00 10 1b 
  16550. ' $0290: 48 e7 e0 38 61 00 00 cc 4c df 1c 07 60 c6 4a 42 
  16551. ' $02a0: 6f 04 32 02 61 30 70 00 61 00 00 b8 47 fa 03 76 
  16552. ' $02b0: 29 53 00 04 4c df 1c 07 4e 75 48 e7 a0 00 34 01 
  16553. ' $02c0: 72 00 30 3a 03 5a 6f 08 32 02 b2 40 65 02 32 00 
  16554. ' $02d0: 4c df 00 05 4e 75 41 fa 03 68 20 fc 00 08 00 01 
  16555. ' $02e0: 70 00 30 c0 30 c1 20 c0 30 ad 00 0c 41 fa 05 6a 
  16556. ' $02f0: 30 fa 03 26 30 85 43 fa 03 34 22 09 70 73 4e 42 
  16557. ' $0300: 4e 75 70 03 60 02 70 01 41 fa 03 36 30 fc 00 20 
  16558. ' $0310: 42 50 31 7c 00 01 00 04 31 6d 00 0c 00 0a 41 fa 
  16559. ' $0320: 03 0c 20 68 00 04 30 80 60 cc c2 ed 00 10 d2 7a 
  16560. ' $0330: 02 e8 53 41 30 05 90 6d 00 0e 52 40 41 fa 03 02 
  16561. ' $0340: 20 fc 00 72 00 02 74 00 20 c2 30 c2 31 6d 00 0c 
  16562. ' $0350: 00 02 41 fa 05 04 30 fa 02 c0 30 c0 30 c1 30 c5 
  16563. ' $0360: 60 94 41 fa 02 dc 30 fc 00 6a 74 00 20 c2 20 fc 
  16564. ' $0370: 00 01 00 01 31 6d 00 0c 00 02 41 fa 02 ac 20 ba 
  16565. ' $0380: 02 b0 41 fa 0a d4 30 80 43 fa 02 a6 22 88 61 00 
  16566. ' $0390: ff 66 43 fa 02 9c 22 ba 02 90 4e 75 43 fa 02 ba 
  16567. ' $03a0: 41 fa 02 76 30 ba 02 74 32 3a 02 74 34 01 53 42 
  16568. ' $03b0: 70 00 10 1a 32 c0 51 ca ff fa 61 00 ff 1a 30 2e 
  16569. ' $03c0: 00 14 67 2a b0 7a 02 58 6a 24 61 00 ff 36 30 2e 
  16570. ' $03d0: 00 14 53 40 61 00 fd 3e 32 2e 00 16 61 00 fe dc 
  16571. ' $03e0: 92 6e 00 14 52 41 61 00 ff 42 61 00 ff 1a 60 00 
  16572. ' $03f0: fc a2 4a 6d 00 16 66 2a 72 07 48 e7 08 80 41 fa 
  16573. ' $0400: 01 cc d2 41 24 04 e8 8c c4 7c 00 0f 14 30 20 00 
  16574. ' $0410: 39 82 10 00 55 41 6a ec 4c df 01 10 49 ec 00 10 
  16575. ' $0420: 4e 75 24 04 88 fc 27 10 20 3c 00 00 03 e8 61 0e 
  16576. ' $0430: 48 44 20 3c 00 00 03 e8 61 04 28 02 4e 75 32 04 
  16577. ' $0440: 48 c1 82 c0 06 01 00 30 19 41 00 01 49 ec 00 02 
  16578. ' $0450: 48 41 80 fc 00 0a 66 e8 4e 75 74 0f 20 4a 10 18 
  16579. ' $0460: 72 00 12 00 e8 49 43 fa 01 64 12 31 10 00 38 c1 
  16580. ' $0470: c0 7c 00 0f 10 31 00 00 38 c0 70 20 38 c0 51 ca 
  16581. ' $0480: ff de 4e 75 30 3a 01 96 32 00 c0 fc 00 03 d0 7c 
  16582. ' $0490: 00 09 b0 7a 01 8a 6a 00 00 a6 c0 ed 00 10 d0 7a 
  16583. ' $04a0: 01 7a 41 fa 01 74 30 80 20 4a d0 c1 3f 01 49 fa 
  16584. ' $04b0: 01 a8 61 aa 32 17 10 33 10 00 c0 7c 00 7f 61 00 
  16585. ' $04c0: fe a2 32 17 61 00 00 82 61 00 fe 0c 32 1f 4a 33 
  16586. ' $04d0: 10 00 6a 12 3f 01 61 00 fe 2a 32 1f 61 6a 61 00 
  16587. ' $04e0: fe 4a 61 00 fe 22 49 fa 01 70 30 3a 01 30 32 00 
  16588. ' $04f0: d0 7c 00 3a b0 7a 01 28 6a 44 c0 ed 00 10 d0 7a 
  16589. ' $0500: 01 1a 41 fa 01 14 30 80 70 00 10 32 10 00 61 00 
  16590. ' $0510: fc 26 38 80 3f 01 10 33 10 00 c0 7c 00 7f 61 00 
  16591. ' $0520: fe 42 72 01 61 00 fd b0 32 1f 4a 33 10 00 6a 0e 
  16592. ' $0530: 61 00 fd d0 72 01 61 00 fd f2 61 00 fd ca 70 00 
  16593. ' $0540: 61 00 fe 20 60 00 fb 4c 92 7a 00 d4 b2 7c 00 02 
  16594. ' $0550: 6a 02 72 02 4e 75 48 e7 f0 e0 70 ff 72 ff 74 ff 
  16595. ' $0560: 76 ff 41 fa 00 78 48 d0 00 0f 43 fa 00 90 48 d1 
  16596. ' $0570: 00 0f 45 fa 00 78 48 d2 00 0f 72 00 52 40 b0 7c 
  16597. ' $0580: 00 10 67 1a 14 33 00 00 c4 3c 00 7f b2 02 67 ec 
  16598. ' $0590: 14 c0 10 80 d1 10 d1 18 12 c2 12 02 60 de 72 00 
  16599. ' $05a0: 41 fa 00 3a 61 1a 72 00 41 fa 00 42 61 12 41 fa 
  16600. ' $05b0: 00 2c 4a 10 6b 04 06 10 00 09 4c df 07 0f 4e 75 
  16601. ' $05c0: 10 10 6b fa 90 01 12 10 10 c0 60 f4 30 31 32 33 
  16602. ' $05d0: 34 35 36 37 38 39 41 42 43 44 45 46 ff ff ff ff 
  16603. ' $05e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
  16604. ' $05f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
  16605. ' $0600: ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 09 
  16606. ' $0610: 00 06 00 23 00 39 00 43 02 78 02 78 ff ff 00 4f 
  16607. ' $0620: ff ff ff ff 00 00 00 00 00 14 f1 b0 00 10 b9 20 
  16608. ' $0630: 00 10 b9 38 00 10 bb 38 00 10 bd 38 00 10 bf 38 
  16609. ' $0640: 00 08 00 01 00 00 00 4f 00 00 00 00 00 06 00 00 
  16610. ' $0650: 00 00 00 00 00 00 00 00 00 20 00 20 00 20 00 20 
  16611. ' $0660: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16612. ' $0670: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16613. ' $0680: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16614. ' $0690: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16615. ' $06a0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16616. ' $06b0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16617. ' $06c0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16618. ' $06d0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16619. ' $06e0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 
  16620. ' $06f0: 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 
  16621. ' $0700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16622. ' $0710: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16623. ' $0720: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16624. ' $0730: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16625. ' $0740: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16626. ' $0750: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16627. ' $0760: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16628. ' $0770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16629. ' $0780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16630. ' $0790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16631. ' $07a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16632. ' $07b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16633. ' $07c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16634. ' $07d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16635. ' $07e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16636. ' $07f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16637. ' $0800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16638. ' $0810: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16639. ' $0820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16640. ' $0830: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16641. ' $0840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16642. ' $0850: 00 00 00 00 00 00 00 00 02 78 03 a7 04 a7 00 47 
  16643. ' $0860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16644. ' $0870: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16645. ' $0880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16646. ' $0890: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16647. ' $08a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16648. ' $08b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16649. ' $08c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16650. ' $08d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16651. ' $08e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16652. ' $08f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16653. ' $0900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16654. ' $0910: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16655. ' $0920: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16656. ' $0930: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16657. ' $0940: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16658. ' $0950: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16659. ' $0960: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16660. ' $0970: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16661. ' $0980: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16662. ' $0990: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16663. ' $09a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16664. ' $09b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16665. ' $09c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16666. ' $09d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16667. ' $09e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16668. ' $09f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16669. ' $0a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16670. ' $0a10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16671. ' $0a20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16672. ' $0a30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16673. ' $0a40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16674. ' $0a50: 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 
  16675. ' $0a60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16676. ' $0a70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16677. ' $0a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16678. ' $0a90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16679. ' $0aa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16680. ' $0ab0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16681. ' $0ac0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16682. ' $0ad0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16683. ' $0ae0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16684. ' $0af0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16685. ' $0b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16686. ' $0b10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16687. ' $0b20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16688. ' $0b30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16689. ' $0b40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16690. ' $0b50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16691. ' $0b60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16692. ' $0b70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16693. ' $0b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16694. ' $0b90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16695. ' $0ba0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16696. ' $0bb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16697. ' $0bc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16698. ' $0bd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16699. ' $0be0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16700. ' $0bf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16701. ' $0c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16702. ' $0c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16703. ' $0c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16704. ' $0c30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16705. ' $0c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16706. ' $0c50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16707. ' $0c60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16708. ' $0c70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16709. ' $0c80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16710. ' $0c90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16711. ' $0ca0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16712. ' $0cb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16713. ' $0cc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16714. ' $0cd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16715. ' $0ce0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16716. ' $0cf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16717. ' $0d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16718. ' $0d10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16719. ' $0d20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16720. ' $0d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16721. ' $0d40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16722. ' $0d50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16723. ' $0d60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16724. ' $0d70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16725. ' $0d80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16726. ' $0d90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16727. ' $0da0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16728. ' $0db0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16729. ' $0dc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16730. ' $0dd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16731. ' $0de0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16732. ' $0df0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16733. ' $0e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16734. ' $0e10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16735. ' $0e20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16736. ' $0e30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16737. ' $0e40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16738. ' $0e50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16739. ' $0e60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16740. ' $0e70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16741. ' $0e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16742. ' $0e90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16743. ' $0ea0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16744. ' $0eb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16745. ' $0ec0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16746. ' $0ed0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16747. ' $0ee0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16748. ' $0ef0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16749. ' $0f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16750. ' $0f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16751. ' $0f20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16752. ' $0f30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16753. ' $0f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16754. ' $0f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16755. ' $0f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16756. ' $0f70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16757. ' $0f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16758. ' $0f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16759. ' $0fa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16760. ' $0fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16761. ' $0fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16762. ' $0fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16763. ' $0fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16764. ' $0ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16765. ' $1000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16766. ' $1010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16767. ' $1020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16768. ' $1030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16769. ' $1040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16770. ' $1050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16771. ' $1060: 00 00 00 00 00 00 00 00 
  16772. ' 4200  Bytes.
  16773.   INLINE zeile%,4200
  16774. ' ## INLINE:
  16775. ' $0000: 42 78 04 46 48 79 00 0b ff ff 4e 4d 58 4f 08 00 
  16776. ' $0010: 00 03 66 22 41 fa 01 b0 74 01 70 03 72 81 c3 10 
  16777. ' $0020: b2 10 67 26 41 e8 00 0c 51 c8 ff f4 41 fa 01 28 
  16778. ' $0030: 70 07 51 ca ff e8 20 78 04 f2 20 28 00 18 b0 7c 
  16779. ' $0040: 19 87 64 04 3e 3c 00 e0 4e 75 7a 01 2c 28 00 04 
  16780. ' $0050: 49 fa 01 ae 47 fa 00 1c 4e 93 66 da 20 4c 32 3c 
  16781. ' $0060: 00 ff 70 00 d0 58 51 c9 ff fc b0 7c 12 34 66 c6 
  16782. ' $0070: 4e d4 b6 bc 44 4d 41 72 66 1c 48 e7 00 60 3f 04 
  16783. ' $0080: 2f 0c 3f 05 2f 06 3f 3c 00 2a 4e 4e 4f ef 00 0e 
  16784. ' $0090: 4c df 06 00 60 78 50 f8 04 3e 20 38 04 ba 54 80 
  16785. ' $00a0: b0 b8 04 ba 64 fa 3c 7c 86 06 20 0c 1d 40 00 07 
  16786. ' $00b0: e0 98 1d 40 00 05 e0 98 1d 40 00 03 3a 7c 86 04 
  16787. ' $00c0: 3c bc 01 98 3c bc 00 98 3a 85 3c bc 00 88 70 00 
  16788. ' $00d0: 10 07 80 3c 00 08 61 3a 48 46 10 06 61 34 e1 9e 
  16789. ' $00e0: 10 06 61 2e e1 9e 10 06 61 28 10 05 61 24 70 0a 
  16790. ' $00f0: 2a 80 32 3c 01 90 61 24 3c bc 00 8a 30 15 c0 7c 
  16791. ' $0100: 00 ff 67 02 70 ff 3c bc 00 80 51 f8 04 3e 4a 00 
  16792. ' $0110: 4e 75 48 40 30 3c 00 8a 2a 80 72 0a d2 b8 04 ba 
  16793. ' $0120: 08 38 00 05 fa 01 67 e8 b2 b8 04 ba 66 f2 58 4f 
  16794. ' $0130: 60 d2 72 0a d2 b8 04 ba 08 38 00 05 fa 01 67 ee 
  16795. ' $0140: b2 b8 04 ba 66 f2 58 4f 60 d8 00 00 00 8a 00 00 
  16796. ' $0150: 00 8a 00 00 00 8a 00 01 00 8a 00 00 00 00 00 00 
  16797. ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16798. ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16799. ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16800. ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16801. ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16802. ' $01b0: 00 00 00 00 00 00 02 64 04 ff 02 65 02 65 04 02 
  16803. ' $01c0: 01 11 00 00 a2 90 81 47 45 4d 00 00 00 01 00 00 
  16804. ' $01d0: 18 00 01 47 45 4d 00 00 18 01 00 00 40 00 01 47 
  16805. ' $01e0: 45 4d 00 00 58 01 00 00 18 00 01 47 45 4d 00 00 
  16806. ' $01f0: 70 01 00 00 12 90 00 00 00 00 00 00 00 00 d4 d3 
  16807. ' 512  Bytes.
  16808.   INLINE root.raw%,512
  16809. ' ## INLINE:
  16810. ' $0000: e9 00 53 45 44 00 60 18 00 00 00 00 02 02 01 00 
  16811. ' $0010: 02 00 01 00 28 f8 15 00 11 00 04 00 00 00 00 00 
  16812. ' $0020: 70 ff 2f 00 3f 3c 00 48 4e 41 41 fa 01 8e 20 80 
  16813. ' $0030: 2f 00 3f 3c 00 48 4e 41 4f ef 00 0c 4a 80 67 00 
  16814. ' $0040: 00 ae 24 40 28 4a d9 fa 01 72 98 fc 08 00 41 fa 
  16815. ' $0050: 01 69 10 3a ff b8 e2 08 10 80 10 3a ff b6 e0 58 
  16816. ' $0060: 10 3a ff af 41 fa 01 60 30 80 70 00 30 3a ff a0 
  16817. ' $0070: e0 58 c0 fa 01 44 d0 86 41 fa 01 48 20 80 2c 00 
  16818. ' $0080: 70 00 30 3a ff 92 e0 58 c0 fa 01 2e dc 80 dc 80 
  16819. ' $0090: 70 00 30 3a 01 32 e8 80 d0 86 41 fa 01 2e 20 80 
  16820. ' $00a0: 7a 01 4e 93 52 86 20 4c 72 0f 70 0a 1a 30 00 00 
  16821. ' $00b0: ba 3b 00 3e 66 1e 51 c8 ff f4 20 28 00 1c e0 58 
  16822. ' $00c0: 48 40 e0 58 24 0c 94 8a b4 80 6b 1a 34 28 00 1a 
  16823. ' $00d0: e0 5a 60 28 d0 fc 00 20 43 fa 00 ec 53 51 67 0e 
  16824. ' $00e0: 51 c9 ff c8 60 ba 3f 3c 00 49 4e 41 5c 8f 4e 75 
  16825. ' $00f0: 43 42 48 44 20 20 20 20 53 59 53 00 41 fa 00 ca 
  16826. ' $0100: 30 82 20 0a 2f 00 41 fa 00 b6 70 ff 20 80 7c 00 
  16827. ' $0110: 3c 3a 00 b6 55 86 7a 00 1a 3a fe f3 ca fa 00 9a 
  16828. ' $0120: cc c5 dc ba 00 a6 c5 4c 4e 93 66 ba c5 4c 30 3c 
  16829. ' $0130: 02 00 c0 c5 d4 c0 7c 00 3c 3a 00 8e e0 4e dc ba 
  16830. ' $0140: 00 82 bc ba 00 7a 67 0c 7a 01 41 fa 00 72 20 86 
  16831. ' $0150: 4e 93 66 92 34 3a 00 72 c4 7c 00 ff d4 42 48 c2 
  16832. ' $0160: 34 34 20 00 e0 5a 67 08 41 fa 00 5e 30 82 6a 9e 
  16833. ' $0170: 24 57 20 4a 0c 58 60 1a 66 00 ff 6c 58 8f 43 ea 
  16834. ' $0180: 00 1c d3 d8 d3 d8 d3 e8 00 04 4a 91 67 20 41 ea 
  16835. ' $0190: 00 1c 22 08 70 00 d1 d9 d3 90 10 19 67 10 b0 3c 
  16836. ' $01a0: 00 01 66 06 d0 fc 00 fe 60 f0 d0 c0 60 ea 31 fa 
  16837. ' $01b0: fe 6e 04 82 4e ea 00 20 00 00 00 00 00 00 00 00 
  16838. ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16839. ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16840. ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16841. ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  16842. ' 512  Bytes.
  16843.   INLINE boot.raw%,512
  16844. ' ## INLINE:
  16845. ' $0000: 4e 56 ff fa 20 2e 00 08 66 70 41 fa 00 42 20 ee 
  16846. ' $0010: 00 0c 20 ee 00 10 20 ae 00 14 48 7a 00 0e 3f 3c 
  16847. ' $0020: 00 26 4e 4e 5c 8f 4e 5e 4e 75 43 fa 00 20 51 d1 
  16848. ' $0030: 20 38 00 10 22 0f 41 fa 00 0c 21 c8 00 10 4e 7a 
  16849. ' $0040: 00 02 50 d1 2e 41 21 c0 00 10 4e 75 ff 00 00 02 
  16850. ' $0050: 00 00 00 00 e2 5c 00 00 00 00 2f 00 30 3a ff ee 
  16851. ' $0060: 67 14 40 e7 00 7c 07 00 4e 7a 00 02 80 7c 08 08 
  16852. ' $0070: 4e 7b 00 02 46 df 20 1f 4e 75 48 e7 7f fc 2a 40 
  16853. ' $0080: 42 a7 3f 3c 00 20 4e 41 5c 8f 2f 00 50 f8 04 3e 
  16854. ' $0090: 3e 2d 00 20 51 47 6b 08 67 52 53 47 67 5e 60 3e 
  16855. ' $00a0: 4a 6d 00 20 66 04 61 68 60 20 61 00 00 84 3c 2d 
  16856. ' $00b0: 00 00 70 00 3b 40 00 1e 3b 40 00 1c 2d 40 ff fc 
  16857. ' $00c0: 3d 40 ff fa 61 00 00 a4 61 90 42 78 04 3e 3f 3c 
  16858. ' $00d0: 00 20 4e 41 5c 8f 4c df 3f fe 60 00 ff 4a 31 fc 
  16859. ' $00e0: 00 90 86 06 3b 78 86 06 00 24 60 de 31 ed 00 22 
  16860. ' $00f0: 86 06 61 00 01 5a 3b 47 00 24 60 ee 3e 2d 00 24 
  16861. ' $0100: ce 7c 00 ff 31 ed 00 22 86 06 61 00 01 3a 60 da 
  16862. ' $0110: 31 fc 00 80 86 06 2e 3c 00 00 07 d0 de b8 04 ba 
  16863. ' $0120: be b8 04 ba 6b 0a 30 38 86 04 08 00 00 07 66 f0 
  16864. ' $0130: 3e 2d 00 20 0a 07 00 07 ce 3c 00 07 40 e7 00 7c 
  16865. ' $0140: 07 00 11 fc 00 0e 88 00 10 38 88 00 c0 3c 00 f8 
  16866. ' $0150: 8e 00 11 c7 88 02 46 df 4e 75 31 fc 00 86 86 06 
  16867. ' $0160: 3e 2d 00 02 61 00 00 e0 60 68 3e 06 3a 06 08 06 
  16868. ' $0170: 00 07 66 0c cc 3c 00 f0 bc 3c 00 10 67 dc 66 e8 
  16869. ' $0180: 08 06 00 06 66 08 08 06 00 05 67 28 66 5a e8 4e 
  16870. ' $0190: 9c 3c 00 0c 67 00 01 74 55 06 67 48 9c 3c 00 01 
  16871. ' $01a0: 67 64 61 00 00 a2 32 3c 00 fa 4a 38 fa 01 51 c9 
  16872. ' $01b0: ff fa 4e 75 61 5a 08 05 00 04 66 0a 42 6d 00 1e 
  16873. ' $01c0: 7e 01 61 00 00 82 31 fc 00 84 86 06 3e 2d 00 04 
  16874. ' $01d0: 61 74 31 fc 00 80 86 06 3e 05 61 6a 61 00 00 ec 
  16875. ' $01e0: 60 00 00 b8 61 2a 60 ea 61 42 08 05 00 04 66 08 
  16876. ' $01f0: 42 6d 00 1e 7e 01 61 4e 31 fc 01 84 86 06 3e 2d 
  16877. ' $0200: 00 04 61 42 60 02 61 24 31 fc 01 80 86 06 60 c8 
  16878. ' $0210: 50 ee ff fa 61 00 02 74 61 06 61 00 00 9a 60 24 
  16879. ' $0220: 2e 2d 00 08 61 4e 50 ed 00 1e 4e 75 61 00 02 90 
  16880. ' $0230: 61 ee 36 3c 01 90 31 c3 86 06 31 fc 00 90 86 06 
  16881. ' $0240: 31 c3 86 06 7e 1f 61 0c 31 c7 86 04 60 06 61 04 
  16882. ' $0250: 3e 38 86 04 2f 01 72 19 61 00 ff 50 22 1f 4e 75 
  16883. ' $0260: 70 00 10 38 86 09 e1 88 10 38 86 0b e1 88 10 38 
  16884. ' $0270: 86 0d 4e 75 2b 47 00 14 11 c7 86 0d 11 ed 00 16 
  16885. ' $0280: 86 0b 11 ed 00 15 86 09 2e 2d 00 14 70 00 30 2d 
  16886. ' $0290: 00 06 de 80 2b 47 00 18 4e 75 31 c3 86 06 3b 78 
  16887. ' $02a0: 86 06 00 12 61 ba 2b 40 00 18 90 ad 00 14 3b 40 
  16888. ' $02b0: 00 06 60 00 01 ea 36 3c 00 90 31 c3 86 06 31 fc 
  16889. ' $02c0: 01 90 86 06 31 c3 86 06 4e 75 2e 3c 00 00 01 90 
  16890. ' $02d0: de b8 04 ba 08 38 00 05 fa 01 67 16 be b8 04 ba 
  16891. ' $02e0: 67 10 4a 6d 00 1e 67 ec 61 00 ff 76 90 ad 00 18 
  16892. ' $02f0: 6b e2 42 6d 00 1e 3b 78 86 04 00 10 1e 3c 00 d0 
  16893. ' $0300: 60 00 fe a0 50 ed 00 1c 60 e8 42 6d 00 1e 50 ee 
  16894. ' $0310: ff fa 61 00 01 76 2e 2d 00 08 61 00 ff 58 61 96 
  16895. ' $0320: 7e 01 61 00 ff 22 48 e7 7f fe 61 00 fd 2e 3f 3c 
  16896. ' $0330: 00 22 4e 4e 54 8f d0 bc 00 00 00 24 41 fa 01 04 
  16897. ' $0340: 20 80 20 40 4a 10 66 fc 40 e7 00 7c 07 00 4a 10 
  16898. ' $0350: 67 04 46 df 60 ee 61 00 01 06 41 fa 00 e4 43 fa 
  16899. ' $0360: 00 d2 23 48 00 02 61 00 00 de 41 fa 00 c6 20 3c 
  16900. ' $0370: 00 03 00 04 61 00 00 d6 3f 3c 00 0d 3f 3c 00 1b 
  16901. ' $0380: 4e 4e 58 8f 46 df 4c df 7f fe 26 6d 00 0c 31 fc 
  16902. ' $0390: 00 80 86 06 34 2d 00 06 72 04 61 00 00 de 08 38 
  16903. ' $03a0: 00 05 fa 01 66 f8 51 c9 ff f2 61 00 00 ce 41 fa 
  16904. ' $03b0: 00 90 42 50 08 38 00 05 fa 01 66 f8 32 10 36 c1 
  16905. ' $03c0: 42 50 31 c5 86 04 b2 50 6b 12 08 38 00 05 fa 01 
  16906. ' $03d0: 66 f4 36 f8 86 04 36 d0 51 ca ff e8 48 e7 7f fe 
  16907. ' $03e0: 20 7a 00 60 4a 10 66 fc 40 e7 00 7c 07 00 4a 10 
  16908. ' $03f0: 67 04 46 df 60 ee 61 4e 3f 3c 00 0d 3f 3c 00 1a 
  16909. ' $0400: 4e 4e 58 8f 61 5e 46 df 4c df 7f fe 61 00 fe ee 
  16910. ' $0410: 72 02 42 5b 3e 3c 00 c0 61 00 fe 2c 08 38 00 05 
  16911. ' $0420: fa 01 66 f8 42 9b 51 c9 ff ec 61 00 fe d0 60 00 
  16912. ' $0430: fe 6a 52 79 ff ff ff ff 08 b8 00 05 fa 0f 4e 73 
  16913. ' $0440: 00 00 00 00 00 00 70 00 30 7c ff ff 48 50 2f 00 
  16914. ' $0450: 42 67 3f 3c 00 1f 4e 4e 4f ef 00 0c 4e 75 41 fa 
  16915. ' $0460: 00 16 60 04 41 fa 00 12 48 50 42 67 3f 3c 00 19 
  16916. ' $0470: 4e 4e 50 8f 4e 75 12 00 08 00 3e 3c 00 d4 61 00 
  16917. ' $0480: fd c6 30 38 86 04 60 00 fd cc 4a 2d 00 08 67 0c 
  16918. ' $0490: 2d 6d 00 08 ff fc 2b 7a fb ba 00 08 4e 75 20 2e 
  16919. ' $04a0: ff fc 67 18 22 40 20 6d 00 08 2b 40 00 08 30 2e 
  16920. ' $04b0: ff fa 67 08 30 2d 00 06 48 c0 61 20 4e 75 4a 2d 
  16921. ' $04c0: 00 08 67 16 43 ee ff fc 20 6d 00 08 22 88 22 7a 
  16922. ' $04d0: fb 82 30 2d 00 06 48 c0 61 02 4e 75 d0 7c 00 10 
  16923. ' $04e0: e4 48 12 d8 12 d8 12 d8 12 d8 53 80 66 f4 4e 75 
  16924. ' $04f0: 00 00 00 00 00 00 
  16925. ' 1270  Bytes.
  16926.   INLINE locksley%,1270
  16927. ' ## INLINE:
  16928. ' $0000: 20 6f 00 04 20 08 66 4a 41 fa 00 ae 20 ef 00 08 
  16929. ' $0010: 20 ef 00 0c 20 ef 00 10 20 2f 00 14 c0 fc 00 c8 
  16930. ' $0020: 20 80 48 7a 00 0c 3f 3c 00 26 4e 4e 5c 8f 4e 75 
  16931. ' $0030: 43 fa 00 84 51 d1 20 38 00 10 22 0f 41 fa 00 0c 
  16932. ' $0040: 21 c8 00 10 4e 7a 00 02 50 d1 2e 41 21 c0 00 10 
  16933. ' $0050: 4e 75 48 e7 7f 7e 2a 48 42 a7 3f 3c 00 20 4e 41 
  16934. ' $0060: 5c 8f 2f 00 4e 71 43 fa 05 28 08 2d 00 03 00 05 
  16935. ' $0070: 67 12 43 fa 00 54 30 3a 00 40 b0 7c 00 02 67 04 
  16936. ' $0080: 70 f7 60 02 4e 91 28 00 61 10 3f 3c 00 20 4e 41 
  16937. ' $0090: 5c 8f 20 04 4c df 7e fe 4e 75 10 3a 00 1a 67 14 
  16938. ' $00a0: 40 e7 00 7c 07 00 4e 7a 00 02 80 7c 08 08 4e 7b 
  16939. ' $00b0: 00 02 46 df 4e 75 ff 00 00 02 00 00 00 00 e2 5c 
  16940. ' $00c0: 00 00 00 00 00 03 a9 80 4e 56 ff e8 08 2d 00 04 
  16941. ' $00d0: 00 01 67 0a 61 00 04 4e 70 00 60 00 00 b2 32 2d 
  16942. ' $00e0: 00 02 70 00 51 41 03 c0 11 c0 87 81 22 38 04 ba 
  16943. ' $00f0: 06 81 00 00 00 32 11 fc 00 00 87 85 11 fc 00 01 
  16944. ' $0100: 87 85 b2 b8 04 ba 6b 00 00 84 08 38 00 06 87 83 
  16945. ' $0110: 67 f0 61 00 03 68 08 38 00 05 87 83 66 d8 14 38 
  16946. ' $0120: 87 81 b4 00 6e d0 08 38 00 05 87 83 66 c8 11 fc 
  16947. ' $0130: 00 04 87 83 08 38 00 05 87 83 66 ba 61 00 03 3e 
  16948. ' $0140: 32 2d 00 04 51 41 03 c0 11 c0 87 81 11 fc 00 00 
  16949. ' $0150: 87 87 11 fc 00 0d 87 83 11 fc 00 00 87 85 11 fc 
  16950. ' $0160: 00 00 87 89 11 fc 00 07 87 83 22 38 04 ba d2 bc 
  16951. ' $0170: 00 00 00 32 08 38 00 06 87 89 66 16 b2 b8 04 ba 
  16952. ' $0180: 62 f2 11 fc 00 00 87 83 70 ff 60 02 70 f8 4e 5e 
  16953. ' $0190: 4e 75 11 fc 00 02 87 83 22 6d 00 10 1d 51 ff e8 
  16954. ' $01a0: 2d 49 ff ee 74 00 14 29 00 01 ea 0a 84 3c 00 80 
  16955. ' $01b0: 1d 42 ff fe 3d 7c ff fe ff fc 3d 6d 00 06 ff fa 
  16956. ' $01c0: 2d 6d 00 0a ff f2 61 24 61 00 02 c4 6b c0 30 02 
  16957. ' $01d0: d0 40 43 fa 00 08 d2 fb 00 04 4e d1 01 38 00 58 
  16958. ' $01e0: 01 d4 01 ee 00 52 00 52 02 92 01 fe 2d 78 04 ba 
  16959. ' $01f0: ff ea 06 ae 00 00 00 c8 ff ea 0c 6d 00 02 00 0e 
  16960. ' $0200: 6a 2a 06 ae 00 00 07 08 ff ea 0c 2e 00 04 ff e8 
  16961. ' $0210: 66 1a 04 ae 00 00 07 08 ff ea 2f 00 20 3a fe a6 
  16962. ' $0220: 04 80 00 00 08 98 d1 ae ff ea 20 1f 4e 75 70 fd 
  16963. ' $0230: 60 00 ff 5c 11 fc 00 00 87 15 43 f8 87 01 30 2d 
  16964. ' $0240: 00 06 67 00 03 00 c0 ed 00 08 01 c9 00 08 2d 40 
  16965. ' $0250: ff f6 20 2d 00 0a 01 c9 00 00 10 38 87 8f 11 c2 
  16966. ' $0260: 87 87 11 fc 00 00 87 83 11 fc 00 02 87 85 11 fc 
  16967. ' $0270: 00 00 87 8f 11 fc 00 02 87 15 22 38 04 ba d2 bc 
  16968. ' $0280: 00 00 07 d0 b2 b8 04 ba 6b 1a 08 38 00 05 fa 81 
  16969. ' $0290: 67 08 08 38 00 07 fa 81 67 ea 61 62 67 0e 70 fb 
  16970. ' $02a0: 60 00 fe ec 61 58 70 f8 60 00 fe e4 43 f8 87 01 
  16971. ' $02b0: 01 49 00 00 b0 ad 00 0a 66 06 70 fa 60 00 fe d0 
  16972. ' $02c0: 22 2d 00 0a 2b 40 00 0a 90 81 80 ed 00 08 91 6d 
  16973. ' $02d0: 00 06 10 38 87 07 02 40 00 03 67 1e 01 49 00 00 
  16974. ' $02e0: 22 00 02 40 00 03 02 41 ff fc 22 41 22 38 87 10 
  16975. ' $02f0: 53 40 e1 99 12 c1 51 c8 ff fa 60 00 fe ca 10 38 
  16976. ' $0300: 87 15 11 fc 00 00 87 15 11 fc 00 00 87 85 c0 3c 
  16977. ' $0310: 00 80 4e 75 43 f8 87 01 30 2d 00 06 67 00 02 26 
  16978. ' $0320: c0 ed 00 08 01 c9 00 08 2d 40 ff f6 20 2d 00 0a 
  16979. ' $0330: 01 c9 00 00 11 c2 87 87 10 38 87 8f 11 fc 00 01 
  16980. ' $0340: 87 83 11 fc 00 02 87 85 11 fc 00 00 87 8b 11 fc 
  16981. ' $0350: 00 01 87 15 11 fc 00 03 87 15 22 38 04 ba d2 bc 
  16982. ' $0360: 00 00 07 d0 b2 b8 04 ba 6b 00 ff 3a 08 38 00 05 
  16983. ' $0370: fa 81 67 08 08 38 00 07 fa 81 67 e8 61 80 67 06 
  16984. ' $0380: 70 fb 60 00 fe 0a 43 f8 87 01 01 49 00 00 b0 ad 
  16985. ' $0390: 00 0a 66 06 70 fa 60 00 fd f6 22 2d 00 0a 2b 40 
  16986. ' $03a0: 00 0a 90 81 80 ed 00 08 91 6d 00 06 60 00 fe 18 
  16987. ' $03b0: 11 c2 87 87 22 6e ff ee 14 11 52 ae ff ee 53 6d 
  16988. ' $03c0: 00 0e 61 00 00 f6 60 00 fd fe 61 00 01 16 3d 42 
  16989. ' $03d0: ff fc 61 00 00 f8 60 00 fd ee 61 00 01 06 22 6d 
  16990. ' $03e0: 00 14 12 c2 2b 49 00 14 b4 3c 00 00 67 7a b4 3c 
  16991. ' $03f0: 00 01 67 48 b4 3c 00 08 67 2c b4 3c 00 07 67 26 
  16992. ' $0400: b4 3c 00 02 67 14 b4 3c 00 03 66 22 2b 6e ff f2 
  16993. ' $0410: 00 0a 3b 6e ff fa 00 06 60 0c 2d 6d 00 0a ff f2 
  16994. ' $0420: 3d 6d 00 06 ff fa 61 00 00 a4 60 00 fd 9a 1d 7c 
  16995. ' $0430: 00 07 ff fe 61 00 00 9e 60 00 fd 8c 1d 7c 00 07 
  16996. ' $0440: ff fe 61 00 00 90 61 00 fd a4 61 42 6b 00 fd 40 
  16997. ' $0450: b4 3c 00 07 66 00 fd 78 61 00 00 88 22 6d 00 14 
  16998. ' $0460: 12 c2 2b 49 00 14 60 da 61 62 60 00 00 90 11 c2 
  16999. ' $0470: 87 87 14 2e ff fe 61 42 60 00 fd 4c 4a 38 fa 01 
  17000. ' $0480: 4a 38 fa 01 4a 38 fa 01 4a 38 fa 01 4e 75 20 2e 
  17001. ' $0490: ff ea b0 b8 04 ba 6b 1e 10 38 87 89 08 00 00 06 
  17002. ' $04a0: 67 10 08 00 00 05 67 e6 34 00 e4 4a 02 42 00 07 
  17003. ' $04b0: 4e 75 70 fc 4e 75 70 f8 4e 75 11 c2 87 81 11 fc 
  17004. ' $04c0: 00 01 87 83 08 f8 00 04 87 83 61 24 11 fc 00 00 
  17005. ' $04d0: 87 83 4e 75 11 fc 00 12 87 83 11 fc 00 02 87 83 
  17006. ' $04e0: 4e 75 70 00 10 38 87 81 34 00 08 f8 00 04 87 83 
  17007. ' $04f0: 10 38 87 89 08 00 00 05 66 f6 4e 75 20 38 04 ba 
  17008. ' $0500: d0 bc 00 00 00 32 b0 b8 04 ba 6b 12 08 38 00 06 
  17009. ' $0510: 87 89 66 f2 30 2e ff fc 48 c0 60 00 fc 72 70 f9 
  17010. ' $0520: 60 00 fc 6c 11 fc 00 80 87 83 22 3c 00 00 00 c8 
  17011. ' $0530: 61 00 02 82 11 fc 00 00 87 83 22 3c 00 00 00 c8 
  17012. ' $0540: 60 00 02 72 22 6d 00 0a 36 02 11 c2 87 87 08 03 
  17013. ' $0550: 00 00 66 1e 14 19 61 00 ff 62 61 00 fc 90 61 00 
  17014. ' $0560: ff 2e 6b 0a 2b 49 00 0a b6 02 67 e8 70 00 60 00 
  17015. ' $0570: fc 56 61 00 ff 6e 61 00 ff 54 12 c2 2b 49 00 0a 
  17016. ' $0580: 61 00 fc 6a 61 00 ff 08 6b e4 b6 02 67 e4 60 dc 
  17017. ' $0590: 4e 56 ff fc 49 f8 86 04 47 f8 86 06 50 f8 04 3e 
  17018. ' $05a0: 20 6d 00 10 2d 7c ff ff ff fe ff fc 08 2d 00 04 
  17019. ' $05b0: 00 01 67 12 36 bc 00 8a 30 14 42 ae ff fc 36 bc 
  17020. ' $05c0: 00 80 4a 54 60 68 70 00 30 2d 00 06 66 0c 32 2d 
  17021. ' $05d0: 00 00 c2 7c 00 06 67 02 70 01 61 00 02 72 24 6d 
  17022. ' $05e0: 00 0a 2f 0a 4a 2d 00 0a 67 16 22 7a fa d0 2b 49 
  17023. ' $05f0: 00 0a 08 2d 00 01 00 01 67 06 30 05 61 00 02 66 
  17024. ' $0600: 2f 2d 00 0a 61 34 20 6d 00 0a 24 5f 91 ca 22 5f 
  17025. ' $0610: d1 c9 2b 48 00 0a 4a 2d 00 0a 67 12 08 2d 00 02 
  17026. ' $0620: 00 01 67 0a 4a 40 66 06 30 05 61 00 02 38 42 78 
  17027. ' $0630: 04 3e 20 2e ff fc 4e 5e 4e 75 7c 00 08 2d 00 00 
  17028. ' $0640: 00 01 67 1a 7c 03 36 bc 00 98 4e 71 36 bc 01 98 
  17029. ' $0650: 08 2d 00 01 00 01 66 04 36 bc 00 98 38 85 22 2d 
  17030. ' $0660: 00 0a 61 00 01 d8 20 6d 00 10 1e 10 ce 7c 00 e0 
  17031. ' $0670: 36 bc 00 88 20 6d 00 10 4a 47 66 0a 30 2d 00 04 
  17032. ' $0680: eb 40 81 10 60 38 41 fa 01 26 30 2d 00 04 eb 40 
  17033. ' $0690: 10 80 22 6d 00 10 11 69 00 01 00 01 32 3c 00 8a 
  17034. ' $06a0: 76 06 61 00 01 28 6b 00 00 d0 36 bc 00 8a 70 00 
  17035. ' $06b0: 30 14 c0 7c 00 ff 08 00 00 01 66 00 00 c0 20 6d 
  17036. ' $06c0: 00 10 70 00 10 10 48 40 61 00 00 d4 82 7c 00 8a 
  17037. ' $06d0: 30 01 28 80 61 00 01 42 6b 00 00 9e 61 00 00 c0 
  17038. ' $06e0: 82 7c 00 8a 36 2d 00 0e 61 00 00 fc 6b 00 00 8a 
  17039. ' $06f0: 08 2d 00 00 00 01 66 1e 36 bc 01 98 4e 71 36 bc 
  17040. ' $0700: 00 98 4e 71 36 bc 01 98 08 2d 00 01 00 01 66 04 
  17041. ' $0710: 36 bc 00 98 38 85 61 00 00 86 30 3c 00 8a 80 41 
  17042. ' $0720: 36 80 70 0a 80 41 32 2d 00 00 c2 7c 00 06 66 04 
  17043. ' $0730: 08 c0 00 07 28 80 08 2d 00 03 00 01 67 08 61 00 
  17044. ' $0740: 00 be 6b 34 60 06 61 00 00 c4 6b 2c 61 50 82 7c 
  17045. ' $0750: 00 8a 36 81 70 00 30 14 c0 7c 00 ff 66 1e 08 2d 
  17046. ' $0760: 00 00 00 01 67 16 72 02 61 4a 51 ce ff 04 61 2e 
  17047. ' $0770: 82 7c 00 8a 36 81 60 04 4a 54 70 f8 2d 40 ff fc 
  17048. ' $0780: 36 bc 00 80 4a 54 42 41 12 38 86 09 e1 81 12 38 
  17049. ' $0790: 86 0b e1 81 12 38 86 0d 2b 41 00 0a 4e 75 72 00 
  17050. ' $07a0: 08 2d 00 01 00 01 67 04 08 c1 00 08 4e 75 40 00 
  17051. ' $07b0: 00 00 00 01 d2 b8 04 ba b2 b8 04 ba 66 fa 4e 75 
  17052. ' $07c0: 42 40 10 10 61 18 6b 02 61 1c 4e 75 61 f2 6b 0c 
  17053. ' $07d0: 10 30 30 ff 48 40 30 01 28 80 61 30 4e 75 48 40 
  17054. ' $07e0: 30 01 28 80 60 32 48 e7 90 80 53 43 52 48 53 43 
  17055. ' $07f0: 67 06 10 18 61 e8 6a f6 4c df 01 09 4e 75 48 e7 
  17056. ' $0800: c0 20 70 00 22 3c 00 03 a9 80 60 14 48 e7 c0 20 
  17057. ' $0810: 70 00 72 64 e7 41 60 08 48 e7 c0 20 70 00 72 14 
  17058. ' $0820: d2 b8 04 ba 08 38 00 05 fa 01 67 08 b2 b8 04 ba 
  17059. ' $0830: 66 f2 70 f8 4a 80 4c df 04 03 4e 75 11 c1 86 0d 
  17060. ' $0840: e0 81 11 c1 86 0b e0 81 11 c1 86 09 4e 75 3a 2d 
  17061. ' $0850: 00 08 ca c0 8a fc 02 00 2c 05 48 46 4a 46 67 02 
  17062. ' $0860: 52 45 4e 75 4a 40 67 fa 48 e7 7f 9e 3f 00 4c da 
  17063. ' $0870: 79 ff 48 d1 79 ff 4c da 79 ff 48 e9 79 ff 00 34 
  17064. ' $0880: 4c da 79 ff 48 e9 79 ff 00 68 4c da 79 ff 48 e9 
  17065. ' $0890: 79 ff 00 9c 4c da 79 ff 48 e9 79 ff 00 d0 4c da 
  17066. ' $08a0: 79 ff 48 e9 79 ff 01 04 4c da 79 ff 48 e9 79 ff 
  17067. ' $08b0: 01 38 4c da 79 ff 48 e9 79 ff 01 6c 4c da 79 ff 
  17068. ' $08c0: 48 e9 79 ff 01 a0 4c da 19 ff 48 e9 19 ff 01 d4 
  17069. ' $08d0: 43 e9 02 00 53 57 66 96 54 4f 4c df 79 fe 4e 75 
  17070. ' $08e0: 00 00 00 00 00 00 00 00 
  17071. ' 2280  Bytes.
  17072.   INLINE scsi%,2280
  17073. ' ## INLINE:
  17074. ' $0000: 00 01 00 01 00 01 00 00 00 01 7f f8 ff fc ff fe 
  17075. ' $0010: ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe 
  17076. ' $0020: ff fe ff fe ff fe ff fe ff fc 00 00 7f f8 53 e4 
  17077. ' $0030: 53 a4 53 a4 53 a4 4f c4 40 04 4f e4 50 14 50 14 
  17078. ' $0040: 50 14 70 14 50 14 7f fc 00 00 
  17079. ' 74  Bytes.
  17080.   INLINE mdisk%,74
  17081. ' ## INLINE:
  17082. ' $0000: 00 05 00 00 00 01 00 00 00 01 0f 00 0f 80 1f c0 
  17083. ' $0010: 1f c0 0f 80 0f 80 3f e0 3f f0 3f f8 3f fc 3f fc 
  17084. ' $0020: 3f f8 7f fc ff fc 7f f8 3f f0 04 00 05 00 09 80 
  17085. ' $0030: 0c 80 05 00 01 00 00 00 1f e0 10 70 10 68 10 68 
  17086. ' $0040: 10 f0 0f c0 7f f8 3f f0 00 00 
  17087. ' 74  Bytes.
  17088.   INLINE mtasse%,74
  17089.   '
  17090. ' ## INLINE:
  17091. ' $0000: 4f 4b 00 4b 65 69 6e 20 49 6e 64 65 78 69 6d 70 
  17092. ' $0010: 75 6c 73 00 53 75 63 68 65 20 6e 6f 63 68 00 53 
  17093. ' $0020: 63 68 72 65 69 62 66 65 68 6c 65 72 00 4c 61 75 
  17094. ' $0030: 66 77 65 72 6b 20 6e 69 63 68 74 20 62 65 72 65 
  17095. ' $0040: 69 74 00 4c 61 75 66 77 65 72 6b 20 6e 69 63 68 
  17096. ' $0050: 74 20 73 65 6c 65 6b 74 69 65 72 74 00 53 70 75 
  17097. ' $0060: 72 20 30 20 6e 69 63 68 74 20 67 65 66 75 6e 64 
  17098. ' $0070: 65 6e 00 4d 65 68 72 65 72 65 20 4c 61 75 66 77 
  17099. ' $0080: 65 72 6b 65 20 73 65 6c 65 6b 74 69 65 72 74 00 
  17100. ' $0090: 00 00 00 00 00 00 00 00 43 52 43 2d 46 65 68 6c 
  17101. ' $00a0: 65 72 20 69 6d 20 41 64 72 65 9e 66 65 6c 64 00 
  17102. ' $00b0: 55 6e 6b 6f 72 72 69 67 69 65 72 62 61 72 65 72 
  17103. ' $00c0: 20 44 61 74 65 6e 66 65 68 6c 65 72 00 49 44 2d 
  17104. ' $00d0: 41 64 72 65 9e 6d 61 72 6b 65 20 76 65 72 73 63 
  17105. ' $00e0: 68 6f 6c 6c 65 6e 00 44 61 74 65 6e 2d 41 64 72 
  17106. ' $00f0: 65 9e 6d 61 72 6b 65 20 76 65 72 73 63 68 6f 6c 
  17107. ' $0100: 6c 65 6e 00 53 65 6b 74 6f 72 20 6e 69 63 68 74 
  17108. ' $0110: 20 67 65 66 75 6e 64 65 6e 00 53 70 75 72 20 6e 
  17109. ' $0120: 69 63 68 74 20 67 65 66 75 6e 64 65 6e 00 42 65 
  17110. ' $0130: 68 6f 62 65 6e 65 72 20 46 65 68 6c 65 72 20 69 
  17111. ' $0140: 6e 20 44 61 74 61 20 41 4d 00 42 65 68 6f 62 65 
  17112. ' $0150: 6e 65 72 20 44 61 74 65 6e 66 65 6c 64 2d 46 65 
  17113. ' $0160: 68 6c 65 72 00 45 43 43 2d 6b 6f 72 72 69 67 69 
  17114. ' $0170: 65 72 74 65 72 20 44 61 74 65 6e 66 65 6c 64 2d 
  17115. ' $0180: 46 65 68 6c 65 72 00 46 65 68 6c 65 72 20 69 6e 
  17116. ' $0190: 20 44 65 66 65 6b 74 6c 69 73 74 65 2f 45 43 43 
  17117. ' $01a0: 2d 46 65 68 6c 65 72 20 28 56 65 72 69 66 79 29 
  17118. ' $01b0: 00 50 61 72 61 6d 65 74 65 72 81 62 65 72 6c 61 
  17119. ' $01c0: 75 66 20 28 49 6e 74 65 72 6c 65 61 76 65 3f 29 
  17120. ' $01d0: 00 00 50 6c 61 74 74 65 6e 66 6f 72 6d 61 74 20 
  17121. ' $01e0: 64 65 66 65 6b 74 2f 6b 65 69 6e 65 20 44 65 66 
  17122. ' $01f0: 65 6b 74 6c 69 73 74 65 00 00 00 00 55 6e 67 81 
  17123. ' $0200: 6c 74 69 67 65 72 20 42 65 66 65 68 6c 00 55 6e 
  17124. ' $0210: 67 81 6c 74 69 67 65 20 42 6c 6f 63 6b 61 64 72 
  17125. ' $0220: 65 73 73 65 00 55 6e 67 81 6c 74 69 67 65 20 46 
  17126. ' $0230: 75 6e 6b 74 69 6f 6e 00 55 6e 67 81 6c 74 69 67 
  17127. ' $0240: 65 20 45 6e 64 61 64 72 65 73 73 65 00 50 61 72 
  17128. ' $0250: 61 6d 65 74 65 72 66 65 68 6c 65 72 00 55 6e 67 
  17129. ' $0260: 81 6c 74 69 67 65 20 47 65 72 84 74 65 6e 75 6d 
  17130. ' $0270: 6d 65 72 00 55 6e 67 81 6c 74 69 67 65 73 20 50 
  17131. ' $0280: 61 72 61 6d 65 74 65 72 66 65 6c 64 00 4d 65 64 
  17132. ' $0290: 69 75 6d 20 73 63 68 72 65 69 62 67 65 73 63 68 
  17133. ' $02a0: 81 74 7a 74 00 4d 65 64 69 75 6d 20 67 65 77 65 
  17134. ' $02b0: 63 68 73 65 6c 74 00 52 65 73 65 74 20 73 65 69 
  17135. ' $02c0: 74 20 6c 65 74 7a 74 65 6d 20 4b 6f 6d 6d 61 6e 
  17136. ' $02d0: 64 6f 00 00 00 46 65 68 6c 65 72 7a 84 68 6c 65 
  17137. ' $02e0: 72 20 81 62 65 72 67 65 6c 61 75 66 65 6e 00 00 
  17138. ' $02f0: 00 00 4d 65 64 69 75 6d 20 69 6e 6b 6f 6d 70 61 
  17139. ' $0300: 74 69 62 65 6c 00 46 6f 72 6d 61 74 69 65 72 66 
  17140. ' $0310: 65 68 6c 65 72 00 00 4d 65 73 73 61 67 65 2d 46 
  17141. ' $0320: 65 68 6c 65 72 00 53 43 53 49 2d 48 61 72 64 77 
  17142. ' $0330: 61 72 65 66 65 68 6c 65 72 00 28 52 65 29 53 65 
  17143. ' $0340: 6c 65 63 74 2d 46 65 68 6c 65 72 00 46 65 68 6c 
  17144. ' $0350: 65 72 20 62 65 69 20 53 6f 66 74 77 61 72 65 2d 
  17145. ' $0360: 52 65 73 65 74 00 50 61 72 69 74 84 74 73 66 65 
  17146. ' $0370: 68 6c 65 72 00 49 6e 69 74 69 61 74 6f 72 20 6e 
  17147. ' $0380: 69 63 68 74 20 65 72 6b 61 6e 6e 74 00 4d 65 73 
  17148. ' $0390: 73 61 67 65 20 75 6e 67 81 6c 74 69 67 00 00 00 
  17149. ' $03a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17150. ' $03b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17151. ' $03c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17152. ' $03d0: 00 00 00 00 53 65 6c 62 73 74 74 65 73 74 2d 46 
  17153. ' $03e0: 65 68 6c 65 72 00 53 65 6c 62 73 74 74 65 73 74 
  17154. ' $03f0: 2d 46 65 68 6c 65 72 20 31 00 53 65 6c 62 73 74 
  17155. ' $0400: 74 65 73 74 2d 46 65 68 6c 65 72 20 32 00 53 65 
  17156. ' $0410: 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 20 
  17157. ' $0420: 33 00 53 65 6c 62 73 74 74 65 73 74 2d 46 65 68 
  17158. ' $0430: 6c 65 72 20 34 00 53 65 6c 62 73 74 74 65 73 74 
  17159. ' $0440: 2d 46 65 68 6c 65 72 20 35 00 53 65 6c 62 73 74 
  17160. ' $0450: 74 65 73 74 2d 46 65 68 6c 65 72 20 36 00 53 65 
  17161. ' $0460: 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 20 
  17162. ' $0470: 37 00 53 65 6c 62 73 74 74 65 73 74 2d 46 65 68 
  17163. ' $0480: 6c 65 72 20 38 00 53 65 6c 62 73 74 74 65 73 74 
  17164. ' $0490: 2d 46 65 68 6c 65 72 20 39 00 53 65 6c 62 73 74 
  17165. ' $04a0: 74 65 73 74 2d 46 65 68 6c 65 72 20 31 30 00 53 
  17166. ' $04b0: 65 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 
  17167. ' $04c0: 20 31 31 00 53 65 6c 62 73 74 74 65 73 74 2d 46 
  17168. ' $04d0: 65 68 6c 65 72 20 31 32 00 53 65 6c 62 73 74 74 
  17169. ' $04e0: 65 73 74 2d 46 65 68 6c 65 72 20 31 33 00 53 65 
  17170. ' $04f0: 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 20 
  17171. ' $0500: 31 34 00 53 65 6c 62 73 74 74 65 73 74 2d 46 65 
  17172. ' $0510: 68 6c 65 72 20 31 35 00 30 20 42 69 74 73 20 45 
  17173. ' $0520: 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 31 20 
  17174. ' $0530: 42 69 74 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 
  17175. ' $0540: 72 74 00 32 20 42 69 74 73 20 45 43 43 2d 6b 6f 
  17176. ' $0550: 72 72 69 67 69 65 72 74 00 33 20 42 69 74 73 20 
  17177. ' $0560: 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 34 
  17178. ' $0570: 20 42 69 74 73 20 45 43 43 2d 6b 6f 72 72 69 67 
  17179. ' $0580: 69 65 72 74 00 35 20 42 69 74 73 20 45 43 43 2d 
  17180. ' $0590: 6b 6f 72 72 69 67 69 65 72 74 00 36 20 42 69 74 
  17181. ' $05a0: 73 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 
  17182. ' $05b0: 00 37 2d 42 69 74 73 20 45 43 43 2d 6b 6f 72 72 
  17183. ' $05c0: 69 67 69 65 72 74 00 38 20 42 69 74 73 20 45 43 
  17184. ' $05d0: 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 39 20 42 
  17185. ' $05e0: 69 74 73 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 
  17186. ' $05f0: 72 74 00 31 30 20 42 69 74 73 20 45 43 43 2d 6b 
  17187. ' $0600: 6f 72 72 69 67 69 65 72 74 00 31 31 20 42 69 74 
  17188. ' $0610: 73 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 
  17189. ' $0620: 00 31 32 20 42 69 74 73 20 45 43 43 2d 6b 6f 72 
  17190. ' $0630: 72 69 67 69 65 72 74 00 31 33 20 42 69 74 73 20 
  17191. ' $0640: 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 31 
  17192. ' $0650: 34 20 42 69 74 73 20 45 43 43 2d 6b 6f 72 72 69 
  17193. ' $0660: 67 69 65 72 74 00 31 35 20 42 69 74 73 20 45 43 
  17194. ' $0670: 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 44 61 74 
  17195. ' $0680: 61 20 43 68 65 63 6b 20 49 6e 20 4e 6f 20 52 65 
  17196. ' $0690: 74 72 79 20 4d 6f 64 65 00 45 43 43 2d 46 65 68 
  17197. ' $06a0: 6c 65 72 00 49 6e 74 65 72 6c 65 61 76 65 2d 46 
  17198. ' $06b0: 65 68 6c 65 72 00 55 6e 67 81 6c 74 69 67 65 73 
  17199. ' $06c0: 20 46 6f 72 6d 61 74 00 55 6e 67 81 6c 74 69 67 
  17200. ' $06d0: 65 20 45 6e 64 61 64 72 65 73 73 65 00 50 61 72 
  17201. ' $06e0: 69 74 84 74 73 66 65 68 6c 65 72 00 4d 4f 44 45 
  17202. ' $06f0: 2d 53 45 4e 53 45 2d 46 65 68 6c 65 72 00 46 61 
  17203. ' $0700: 6c 73 63 68 65 72 20 4b 6f 70 66 00 46 61 6c 73 
  17204. ' $0710: 63 68 65 72 20 5a 79 6c 69 6e 64 65 72 00 44 4d 
  17205. ' $0720: 41 2d 54 69 6d 65 6f 75 74 00 54 69 6d 65 6f 75 
  17206. ' $0730: 74 20 62 65 69 6d 20 53 63 68 72 65 69 62 65 6e 
  17207. ' $0740: 00 46 65 69 6e 6a 75 73 74 69 65 72 75 6e 67 73 
  17208. ' $0750: 2d 46 65 68 6c 65 72 00 46 65 68 6c 65 72 7a 84 
  17209. ' $0760: 68 6c 65 72 20 81 62 65 72 67 65 6c 61 75 66 65 
  17210. ' $0770: 6e 00 4d 65 64 69 65 6e 77 65 63 68 73 65 6c 20 
  17211. ' $0780: 61 6e 67 65 66 6f 72 64 65 72 74 00 56 65 72 69 
  17212. ' $0790: 66 79 2d 46 65 68 6c 65 72 00 2a 00 00 00 
  17213. ' 1950  Bytes.
  17214.   INLINE ihd_err%,1950
  17215. ' ## INLINE:
  17216. ' $0000: 00 9f 00 00 00 03 00 14 00 1f 00 2d 00 43 00 5d 
  17217. ' $0010: 00 73 00 90 00 91 00 92 00 93 00 94 00 95 00 96 
  17218. ' $0020: 00 97 00 98 00 b0 00 cd 00 e7 01 04 01 1a 01 2e 
  17219. ' $0030: 01 4a 01 65 01 87 01 b1 01 d1 01 d2 01 f9 01 fa 
  17220. ' $0040: 01 fb 01 fc 02 0e 02 25 02 38 02 4d 02 5d 02 74 
  17221. ' $0050: 02 8d 02 a5 02 b7 02 d3 02 d4 02 d5 02 ef 02 f0 
  17222. ' $0060: 02 f1 02 f2 03 06 03 16 03 17 03 26 03 3a 03 4c 
  17223. ' $0070: 03 66 03 75 03 8d 03 9e 03 9f 03 a0 03 a1 03 a2 
  17224. ' $0080: 03 a3 03 a4 03 a5 03 a6 03 a7 03 a8 03 a9 03 aa 
  17225. ' $0090: 03 ab 03 ac 03 ad 03 ae 03 af 03 b0 03 b1 03 b2 
  17226. ' $00a0: 03 b3 03 b4 03 b5 03 b6 03 b7 03 b8 03 b9 03 ba 
  17227. ' $00b0: 03 bb 03 bc 03 bd 03 be 03 bf 03 c0 03 c1 03 c2 
  17228. ' $00c0: 03 c3 03 c4 03 c5 03 c6 03 c7 03 c8 03 c9 03 ca 
  17229. ' $00d0: 03 cb 03 cc 03 cd 03 ce 03 cf 03 d0 03 d1 03 d2 
  17230. ' $00e0: 03 d3 03 d4 03 e6 03 fa 04 0e 04 22 04 36 04 4a 
  17231. ' $00f0: 04 5e 04 72 04 86 04 9a 04 af 04 c4 04 d9 04 ee 
  17232. ' $0100: 05 03 05 18 05 2e 05 43 05 59 05 6f 05 85 05 9b 
  17233. ' $0110: 05 b1 05 c7 05 dd 05 f3 06 0a 06 21 06 38 06 4f 
  17234. ' $0120: 06 66 06 7d 06 99 06 a4 06 b6 06 c8 06 dd 06 ec 
  17235. ' $0130: 06 fe 07 0c 07 1e 07 2a 07 41 07 58 07 72 07 8c 
  17236. ' $0140: 07 9a 07 9c 00 00 00 00 00 00 
  17237. ' 330  Bytes.
  17238.   INLINE ihd_tab%,330
  17239.   hh_max%=CARD{ihd_tab%}
  17240.   '
  17241.   inl_tab%(0)=ihd_tab%  ! Index 0 = Platten-Fehler
  17242.   inl_dat%(0)=ihd_err%
  17243.   '
  17244. ' ## INLINE:
  17245. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17246. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17247. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17248. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17249. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17250. ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17251. ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17252. ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17253. ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17254. ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17255. ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17256. ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17257. ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17258. ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17259. ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17260. ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17261. ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17262. ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17263. ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17264. ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17265. ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17266. ' $0150: 00 00 00 00 
  17267. ' 340  Bytes.
  17268.   INLINE flp_err%,340
  17269. ' ## INLINE:
  17270. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17271. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17272. ' $0020: 00 00 00 00 00 00 00 00 
  17273. ' 40  Bytes.
  17274.   INLINE flp_tab%,40
  17275.   '
  17276.   inl_tab%(1)=flp_tab%  ! Index 1 = Floppy-Fehler
  17277.   inl_dat%(1)=flp_err%
  17278.   '
  17279. ' ## INLINE:
  17280. ' $0000: 31 30 30 0d 0a 36 38 30 0d 0a 31 35 35 37 35 0d 
  17281. ' $0010: 0a 32 30 39 34 34 0d 0a 32 30 30 30 0d 0a 31 0d 
  17282. ' $0020: 0a 30 0d 0a 36 30 30 0d 0a 30 0d 0a 34 0d 0a 30 
  17283. ' $0030: 0d 0a 31 38 0d 0a 32 0d 0a 32 0d 0a 30 0d 0a 37 
  17284. ' $0040: 0d 0a 33 0d 0a 33 0d 0a 33 0d 0a 33 0d 0a 33 0d 
  17285. ' $0050: 0a 33 0d 0a 33 0d 0a 33 0d 0a 31 0d 0a 31 0d 0a 
  17286. ' $0060: 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 
  17287. ' $0070: 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 
  17288. ' $0080: 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 
  17289. ' $0090: 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 
  17290. ' $00a0: 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 
  17291. ' $00b0: 0a 31 0d 0a 31 0d 0a 31 0d 0a 36 78 36 20 73 79 
  17292. ' $00c0: 73 74 65 6d 20 66 6f 6e 74 00 00 00 00 00 00 00 
  17293. ' $00d0: 00 00 00 00 00 00 00 00 00 00 0d 0a 31 30 0d 0a 
  17294. ' $00e0: 31 35 37 30 30 0d 0a 36 38 30 0d 0a 31 36 33 37 
  17295. ' $00f0: 35 0d 0a 33 31 38 32 34 0d 0a 31 0d 0a 36 35 0d 
  17296. ' $0100: 0a 38 0d 0a 32 0d 0a 36 30 0d 0a 37 0d 0a 32 0d 
  17297. ' $0110: 0a 37 35 0d 0a 38 0d 0a 32 0d 0a 36 33 0d 0a 37 
  17298. ' $0120: 0d 0a 32 0d 0a 36 39 0d 0a 38 0d 0a 32 0d 0a 36 
  17299. ' $0130: 38 0d 0a 38 0d 0a 32 0d 0a 37 37 0d 0a 39 0d 0a 
  17300. ' $0140: 31 0d 0a 36 38 0d 0a 38 0d 0a 31 0d 0a 37 33 0d 
  17301. ' $0150: 0a 38 0d 0a 32 0d 0a 37 33 0d 0a 38 0d 0a 32 0d 
  17302. ' $0160: 0a 31 30 30 0d 0a 31 30 0d 0a 34 0d 0a 36 38 0d 
  17303. ' $0170: 0a 38 0d 0a 32 0d 0a 39 35 0d 0a 31 30 0d 0a 32 
  17304. ' $0180: 0d 0a 38 38 0d 0a 39 0d 0a 4f 70 65 6e 00 49 6e 
  17305. ' $0190: 73 74 00 49 6e 66 6f 00 45 72 72 00 00 04 00 00 
  17306. ' $01a0: 00 00 03 00 00 00 00 46 41 54 00 00 43 6c 6f 73 
  17307. ' $01b0: 65 43 6f 6d 70 00 44 72 69 76 65 44 49 52 00 00 
  17308. ' $01c0: 52 6f 6f 74 00 4c 69 73 74 00 47 72 61 66 00 0d 
  17309. ' $01d0: 0a 00 4c 69 73 74 00 47 72 61 66 00 0d 0a 0d 0a 
  17310. ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17311. ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17312. ' 512  Bytes.
  17313.   INLINE default%,512
  17314.   '                     ! ab hier nur noch Puffer, keine Assemblerroutinen
  17315. ' ## INLINE:
  17316. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17317. ' 16  Bytes.
  17318.   INLINE mes_adr%,16
  17319. ' ## INLINE:
  17320. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17321. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17322. ' 30  Bytes.
  17323.   INLINE scsi_komm%,30
  17324. ' ## INLINE:
  17325. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17326. ' $0010: 00 00 00 00 
  17327. ' 20  Bytes.
  17328.   INLINE com_blk%,20
  17329. ' ## INLINE:
  17330. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17331. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17332. ' $0020: 00 00 00 00 00 00 00 00 
  17333. ' 40  Bytes.
  17334.   INLINE flo_com%,40
  17335. ' ## INLINE:
  17336. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17337. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17338. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17339. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17340. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17341. ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17342. ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17343. ' $0070: 00 00 00 00 00 00 00 00 
  17344. ' 120  Bytes.
  17345.   INLINE vdi_par%,120
  17346. ' ## INLINE:
  17347. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17348. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17349. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17350. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17351. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17352. ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17353. ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17354. ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17355. ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17356. ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17357. ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17358. ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17359. ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17360. ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17361. ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17362. ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17363. ' 256  Bytes.
  17364.   INLINE z_buf%,255
  17365. ' ## INLINE:
  17366. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17367. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17368. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17369. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17370. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17371. ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17372. ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17373. ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17374. ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17375. ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17376. ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17377. ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17378. ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17379. ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17380. ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17381. ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17382. ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17383. ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17384. ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17385. ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17386. ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17387. ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17388. ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17389. ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17390. ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17391. ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17392. ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17393. ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17394. ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17395. ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17396. ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17397. ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17398. ' 512  Bytes.
  17399.   INLINE fdc1%,512
  17400. ' ## INLINE:
  17401. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17402. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17403. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17404. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17405. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17406. ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17407. ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17408. ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17409. ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17410. ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17411. ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17412. ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17413. ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17414. ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17415. ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17416. ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17417. ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17418. ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17419. ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17420. ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17421. ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17422. ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17423. ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17424. ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17425. ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17426. ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17427. ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17428. ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17429. ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17430. ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17431. ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17432. ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17433. ' 512  Bytes.
  17434.   INLINE fdc2%,512
  17435. ' ## INLINE:
  17436. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17437. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17438. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17439. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17440. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17441. ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17442. ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17443. ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17444. ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17445. ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17446. ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17447. ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17448. ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17449. ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17450. ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17451. ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17452. ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17453. ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17454. ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17455. ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17456. ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17457. ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17458. ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17459. ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17460. ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17461. ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17462. ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17463. ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17464. ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17465. ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17466. ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17467. ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17468. ' $0200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17469. ' $0210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17470. ' $0220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17471. ' $0230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17472. ' $0240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17473. ' $0250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17474. ' $0260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17475. ' $0270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17476. ' $0280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17477. ' $0290: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17478. ' $02a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17479. ' $02b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17480. ' $02c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17481. ' $02d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17482. ' $02e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17483. ' $02f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17484. ' $0300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17485. ' $0310: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17486. ' $0320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17487. ' $0330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17488. ' $0340: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17489. ' $0350: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17490. ' $0360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17491. ' $0370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17492. ' $0380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17493. ' $0390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17494. ' $03a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17495. ' $03b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17496. ' $03c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17497. ' $03d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17498. ' $03e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17499. ' $03f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17500. ' $0400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17501. ' $0410: 00 00 00 00 00 00 00 00 00 00 
  17502. ' 1050  Bytes.
  17503.   INLINE fdc3%,1050
  17504.   '            ⇧ ist wichtig wegen mehr Bytes bei Sektor lesen - max 1024?
  17505.   '
  17506.   w_titel%(0)=vdi_par%+40
  17507.   w_titel%(1)=vdi_par%+80       ! Windowtitel
  17508.   trk_len_max%=buf_size%        ! für Floppy
  17509.   '
  17510.   init_mem%=3*buf_size%+512
  17511.   buf%=MALLOC(init_mem%)        ! Speicher resevieren
  17512.   IF buf%=0
  17513.     ~@alrt(3,ver$+"|Zu wenig Speicher frei! ",1,"Abbruch")
  17514.     EDIT
  17515.   ENDIF
  17516.   ' buf%=                       ! 16384 Bytes für Sektordaten
  17517.   undo_buf%=buf%+buf_size%      ! 16384 UNDO Puffer
  17518.   ak%=undo_buf%+buf_size%       ! 16384 Bytes für Statuspuffer
  17519.   buf2%=ak%+buf_size%           !   512 Bytes für Reservepuffer in HARD
  17520.   '
  17521.   clear_buf(1)
  17522.   fat_size%=64*1024
  17523.   fatbuf%=MALLOC(fat_size%)     ! FAT max.?
  17524.   IF fatbuf%=0
  17525.     ~@alrt(3,ver$+"|Kein Speicher für FAT!",1,"Abbruch")
  17526.     ~MFREE(buf%)
  17527.     EDIT
  17528.   ENDIF
  17529.   '
  17530. RETURN
  17531. PROCEDURE rsc_variable
  17532.   .| Glob. Var.: eingabe&,ergebnis&,eok&,etext&,drives&,driabb&,l1&,einname&
  17533.   .|     einerg&,txtname&,einok&,box&,boxtxt&,boxaktiv&,search&,search1&
  17534.   .|     search2&,searchok&,part&,p1n&,p1k&,p1s&,p12n&,p12k&,p12s&,partsli1&
  17535.   .|     partsli2&,partok&,partab&,partitel&,prest&,pcbhd&,pvariabl&,psel&
  17536.   .|     pselabb&,psmin&,psnummer&,psmax&,pselok&,voreinst&,konfigok&
  17537.   .|     vorcurrt&,tabanz&,maxtext&,feed&,feedcode&,dechex&,slider&,dial2pos&
  17538.   .|     sammeln&,txtsavm&,sperrtxt&,konfigab&,hardpara&,paraok&,par1&,par2&
  17539.   .|     par3&,par4&,par5&,par6&,par7&,par8&,par9&,par10&,hardname&,targerat&
  17540.   .|     tgok&,tgabb&,t0&,t15&,geraete&,g0&,g7&,tgwahl&,fat&,fatmin&,fat_nr&
  17541.   .|     fatplus&,fwrt&,fatm1&,fatm2&,fatm3&,fatwrite&,fatabb&,einstell&,help&
  17542.   .|     help1&,help15&,helpabb&,hlp_load&,datei&,dat1&,dat2&,dat3&,dat4&
  17543.   .|     dat5&,dat6&,datramk&,dath1&,dath2&,dath3&,dath4&,dath5&,dath6&,dath7&
  17544.   .|     dath8&,datname&,datdat&,dattime&,datsize&,datsegm&,dats1&,dats2&
  17545.   .|     dats3&,dats4&,datok&,kleinst&,kleintxt&,klein1&,klein2&,lernen&
  17546.   .|     menu1&,ml0&,ml1o&,mendx0&,ml1u&,ml2o&,mendx&,ml2u&,ml3o&,mendx4&
  17547.   .|     ml3u&,ml4o&,ml4u&,m1xo&,menu2&,m2xo&,menu3&,m3xo&,menu4&,m4xo&
  17548.   .|     desktop&,ground&,buttons&,mod1&,mod2&,mod3&,mod4&,mod5&,mod6&
  17549.   .|     modibox&,k1&,k14&,hdcomm&,hdkmblk&,hdkomv1&,hdcm1&,hdcm2&,hdcm3&
  17550.   .|     hdcm4&,hdcm5&,hdcm6&,hdcm7&,hdcm8&,hdcm9&,hdcm10&,hdflag0&,hdflag1&
  17551.   .|     hdflag2&,hdflag3&,hdcmab&,hdcmok&,hdflag4&,bootdat&,bootwr&,bd1&,bd2&
  17552.   .|     bd3&,bd4&,bd5&,bd6&,bd7&,bd8&,bd9&,bp1&,bp2&,bp3&,bp4&,bp5&,bp6&,bp7&
  17553.   .|     bdvolume&,bde1&,bde2&,bootget&,fkey&,f1o&,targmask&,tmaskok&,tghdtyp&
  17554.   .|     tmask1&,acsiall&,acsino&,tmask8&,scsiall&,scsino&,compare&,comps1&
  17555.   .|     comps2&,comps5&,comps6&,compok&,comps3&,comps4&,fontdial&,fontsp&
  17556.   .|     fontsm&,fontname&,fontsize&,fonttest&,fontok&,fontmin&,fontabb&
  17557.   .|     fontall&,fontwael&,menu5&,m5xo&,steprate&,stepa2&,stepb2&,stepresi&
  17558.   .|     stephd&,alrt&,alrti1&,alrti4&,alrti5&,alrtz1&,alrtz5&,alrtb1&,alrtb4&
  17559.   .|     alrtohr&,infos&,ramkonv&,dissed&,distempl&,ctrack&,trkd7&,trkd8&
  17560.   .|     trkd9&,trkd10&,trkd11&,trkd1&,trkd2&,trkd3&,trkd4&,trkd5&,trkd6&
  17561.   .|     trkok&,m.enu1%,m.enu2%,m.enu3%,m.enu4%,m.enu5%,desk.top%,e.ingabe%
  17562.   .|     d.rives%,e.inname%,b.ox%,s.earch%,p.art%,p.sel%,v.oreinst%,hard.para%
  17563.   .|     t.arget%,f.at%,ein.stell%,h.elp%,d.atei%,k.leinst%,hd.comm%,boot.dat%
  17564.   .|     f.key%,targ.mask%,c.ompare%,f.ontdial%,step.rate%,a.lert%,i.nfos%
  17565.   .|     ram.konv%,c.track%
  17566.   .| Ruft auf  : rsc_gaddr
  17567.   .| Aufruf in : rsc_init-1,
  17568.   ' /* Resource Datei Indizes für SED_564 */
  17569.   '
  17570.   eingabe&=0
  17571.   ergebnis&=1
  17572.   eok&=2
  17573.   etext&=5
  17574.   '
  17575.   drives&=1
  17576.   driabb&=1
  17577.   l1&=3
  17578.   '
  17579.   einname&=2
  17580.   einerg&=1
  17581.   txtname&=2
  17582.   einok&=3
  17583.   '
  17584.   box&=3
  17585.   boxtxt&=1
  17586.   boxaktiv&=3
  17587.   '
  17588.   search&=4
  17589.   search1&=2
  17590.   search2&=3
  17591.   searchok&=4
  17592.   '
  17593.   part&=5
  17594.   p1n&=3
  17595.   p1k&=4
  17596.   p1s&=5
  17597.   p12n&=58
  17598.   p12k&=59
  17599.   p12s&=60
  17600.   partsli1&=62
  17601.   partsli2&=63
  17602.   partok&=64
  17603.   partab&=65
  17604.   partitel&=67
  17605.   prest&=68
  17606.   pcbhd&=70
  17607.   pvariabl&=72
  17608.   '
  17609.   psel&=6
  17610.   pselabb&=1
  17611.   psmin&=4
  17612.   psnummer&=5
  17613.   psmax&=6
  17614.   pselok&=7
  17615.   '
  17616.   voreinst&=7
  17617.   konfigok&=2
  17618.   vorcurrt&=4
  17619.   tabanz&=5
  17620.   maxtext&=6
  17621.   feed&=8
  17622.   feedcode&=10
  17623.   dechex&=11
  17624.   slider&=13
  17625.   dial2pos&=15
  17626.   sammeln&=17
  17627.   txtsavm&=19
  17628.   sperrtxt&=21
  17629.   konfigab&=24
  17630.   '
  17631.   hardpara&=8
  17632.   paraok&=1
  17633.   par1&=4
  17634.   par2&=5
  17635.   par3&=6
  17636.   par4&=7
  17637.   par5&=8
  17638.   par6&=9
  17639.   par7&=10
  17640.   par8&=11
  17641.   par9&=12
  17642.   par10&=13
  17643.   hardname&=15
  17644.   '
  17645.   targerat&=9
  17646.   tgok&=1
  17647.   tgabb&=2
  17648.   t0&=5
  17649.   t15&=20
  17650.   geraete&=23
  17651.   g0&=33
  17652.   g7&=40
  17653.   tgwahl&=41
  17654.   '
  17655.   fat&=10
  17656.   fatmin&=3
  17657.   fat_nr&=4
  17658.   fatplus&=5
  17659.   fwrt&=6
  17660.   fatm1&=7
  17661.   fatm2&=8
  17662.   fatm3&=9
  17663.   fatwrite&=10
  17664.   fatabb&=11
  17665.   '
  17666.   einstell&=11
  17667.   '
  17668.   help&=12
  17669.   help1&=3
  17670.   help15&=17
  17671.   helpabb&=18
  17672.   hlp_load&=19
  17673.   '
  17674.   datei&=13
  17675.   dat1&=4
  17676.   dat2&=5
  17677.   dat3&=6
  17678.   dat4&=7
  17679.   dat5&=8
  17680.   dat6&=9
  17681.   datramk&=16
  17682.   dath1&=18
  17683.   dath2&=19
  17684.   dath3&=20
  17685.   dath4&=21
  17686.   dath5&=22
  17687.   dath6&=23
  17688.   dath7&=24
  17689.   dath8&=25
  17690.   datname&=36
  17691.   datdat&=37
  17692.   dattime&=38
  17693.   datsize&=40
  17694.   datsegm&=41
  17695.   dats1&=43
  17696.   dats2&=44
  17697.   dats3&=45
  17698.   dats4&=46
  17699.   datok&=47
  17700.   '
  17701.   kleinst&=14
  17702.   kleintxt&=2
  17703.   klein1&=4
  17704.   klein2&=6
  17705.   lernen&=7
  17706.   '
  17707.   menu1&=15
  17708.   ml0&=13
  17709.   ml1o&=22
  17710.   mendx0&=30
  17711.   ml1u&=34
  17712.   ml2o&=36
  17713.   mendx&=41
  17714.   ml2u&=50
  17715.   ml3o&=52
  17716.   mendx4&=53
  17717.   ml3u&=57
  17718.   ml4o&=59
  17719.   ml4u&=63
  17720.   m1xo&=65
  17721.   '
  17722.   menu2&=16
  17723.   m2xo&=65
  17724.   '
  17725.   menu3&=17
  17726.   m3xo&=65
  17727.   '
  17728.   menu4&=18
  17729.   m4xo&=65
  17730.   '
  17731.   desktop&=19
  17732.   ground&=0
  17733.   buttons&=1
  17734.   mod1&=2
  17735.   mod2&=3
  17736.   mod3&=4
  17737.   mod4&=5
  17738.   mod5&=6
  17739.   mod6&=7
  17740.   modibox&=8
  17741.   k1&=9
  17742.   k14&=22
  17743.   '
  17744.   hdcomm&=20
  17745.   hdkmblk&=1
  17746.   hdkomv1&=3
  17747.   hdcm1&=14
  17748.   hdcm2&=15
  17749.   hdcm3&=16
  17750.   hdcm4&=17
  17751.   hdcm5&=18
  17752.   hdcm6&=19
  17753.   hdcm7&=20
  17754.   hdcm8&=21
  17755.   hdcm9&=22
  17756.   hdcm10&=23
  17757.   hdflag0&=24
  17758.   hdflag1&=25
  17759.   hdflag2&=26
  17760.   hdflag3&=27
  17761.   hdcmab&=32
  17762.   hdcmok&=33
  17763.   hdflag4&=34
  17764.   '
  17765.   bootdat&=21
  17766.   bootwr&=1
  17767.   bd1&=5
  17768.   bd2&=6
  17769.   bd3&=7
  17770.   bd4&=8
  17771.   bd5&=9
  17772.   bd6&=10
  17773.   bd7&=11
  17774.   bd8&=12
  17775.   bd9&=13
  17776.   bp1&=18
  17777.   bp2&=19
  17778.   bp3&=20
  17779.   bp4&=21
  17780.   bp5&=22
  17781.   bp6&=23
  17782.   bp7&=24
  17783.   bdvolume&=26
  17784.   bde1&=27
  17785.   bde2&=28
  17786.   bootget&=29
  17787.   '
  17788.   fkey&=22
  17789.   f1o&=2
  17790.   '
  17791.   targmask&=23
  17792.   tmaskok&=1
  17793.   tghdtyp&=5
  17794.   tmask1&=21
  17795.   acsiall&=41
  17796.   acsino&=42
  17797.   tmask8&=47
  17798.   scsiall&=72
  17799.   scsino&=73
  17800.   '
  17801.   compare&=24
  17802.   comps1&=4
  17803.   comps2&=5
  17804.   comps5&=8
  17805.   comps6&=9
  17806.   compok&=10
  17807.   comps3&=13
  17808.   comps4&=14
  17809.   '
  17810.   fontdial&=25
  17811.   fontsp&=1
  17812.   fontsm&=2
  17813.   fontname&=6
  17814.   fontsize&=7
  17815.   fonttest&=8
  17816.   fontok&=9
  17817.   fontmin&=11
  17818.   fontabb&=12
  17819.   fontall&=14
  17820.   fontwael&=15
  17821.   '
  17822.   menu5&=26
  17823.   m5xo&=65
  17824.   '
  17825.   steprate&=27
  17826.   stepa2&=3
  17827.   stepb2&=10
  17828.   stepresi&=17
  17829.   stephd&=18
  17830.   '
  17831.   alrt&=28
  17832.   alrti1&=1
  17833.   alrti4&=4
  17834.   alrti5&=5
  17835.   alrtz1&=6
  17836.   alrtz5&=10
  17837.   alrtb1&=11
  17838.   alrtb4&=14
  17839.   alrtohr&=15
  17840.   '
  17841.   infos&=29
  17842.   '
  17843.   ramkonv&=30
  17844.   dissed&=3
  17845.   distempl&=4
  17846.   '
  17847.   ctrack&=31
  17848.   trkd7&=4
  17849.   trkd8&=5
  17850.   trkd9&=6
  17851.   trkd10&=7
  17852.   trkd11&=8
  17853.   trkd1&=9
  17854.   trkd2&=13
  17855.   trkd3&=19
  17856.   trkd4&=22
  17857.   trkd5&=26
  17858.   trkd6&=29
  17859.   trkok&=30
  17860.   '
  17861.   ~RSRC_GADDR(0,menu1&,m.enu1%)
  17862.   ~RSRC_GADDR(0,menu2&,m.enu2%)
  17863.   ~RSRC_GADDR(0,menu3&,m.enu3%)
  17864.   ~RSRC_GADDR(0,menu4&,m.enu4%)
  17865.   ~RSRC_GADDR(0,menu5&,m.enu5%)
  17866.   '
  17867.   desk.top%=@rsc_gaddr(desktop&)
  17868.   ' ------------------
  17869.   e.ingabe%=@rsc_gaddr(eingabe&)
  17870.   d.rives%=@rsc_gaddr(drives&)
  17871.   e.inname%=@rsc_gaddr(einname&)
  17872.   b.ox%=@rsc_gaddr(box&)
  17873.   s.earch%=@rsc_gaddr(search&)
  17874.   p.art%=@rsc_gaddr(part&)
  17875.   p.sel%=@rsc_gaddr(psel&)
  17876.   v.oreinst%=@rsc_gaddr(voreinst&)
  17877.   hard.para%=@rsc_gaddr(hardpara&)
  17878.   t.arget%=@rsc_gaddr(targerat&)
  17879.   f.at%=@rsc_gaddr(fat&)
  17880.   ein.stell%=@rsc_gaddr(einstell&)
  17881.   h.elp%=@rsc_gaddr(help&)
  17882.   d.atei%=@rsc_gaddr(datei&)
  17883.   k.leinst%=@rsc_gaddr(kleinst&)
  17884.   hd.comm%=@rsc_gaddr(hdcomm&)
  17885.   boot.dat%=@rsc_gaddr(bootdat&)
  17886.   f.key%=@rsc_gaddr(fkey&)
  17887.   targ.mask%=@rsc_gaddr(targmask&)
  17888.   c.ompare%=@rsc_gaddr(compare&)
  17889.   f.ontdial%=@rsc_gaddr(fontdial&)
  17890.   step.rate%=@rsc_gaddr(steprate&)
  17891.   a.lert%=@rsc_gaddr(alrt&)
  17892.   i.nfos%=@rsc_gaddr(infos&)
  17893.   ram.konv%=@rsc_gaddr(ramkonv&)
  17894.   c.track%=@rsc_gaddr(ctrack&)
  17895. RETURN
  17896. '
  17897. ' 'pfad_format$()' formatiert einen gegebenen Pfad (+Dateiname) auf
  17898. ' eine vorgegebene Länge (format&)! Beispiel: Aus
  17899. ' @pfad_format$("G:\DFUE\CAT\LISTEN\LOCAL\OS-33.LST",30) wird:
  17900. ' "G:\...T\LISTEN\LOCAL\OS-33.LST"! Dabei geht die Funktion davon aus, daß
  17901. ' es sich um einen absoluten Pfad inkl. Laufwerks-Angabe handelt! Die
  17902. ' ersten drei Zeichen werden immer ausgegeben!
  17903. DEFFN pfad_format$(pfad$,format&)=STRING$(-(LEN(pfad$)>format&),LEFT$(pfad$,3)+"...")+RIGHT$(pfad$,format&+6*(LEN(pfad$)>format&))
  17904. FUNCTION mousek
  17905.   .| Aufruf in : was_ist-1,fdc_speed-3,fdc_protect-1,maus_off-1,
  17906.   LOCAL dum&,pmstate&
  17907.   ~GRAF_MKSTATE(dum&,dum&,pmstate&,dum&)
  17908.   RETURN pmstate&
  17909. ENDFUNC
  17910. ' ------------------------------ End of Text -------------------------------
  17911. PROCEDURE test_suche
  17912.   .| Glob. Var.: po%,erg%,s$,a$,buf$,bps%,buf%,lgs%
  17913.   .| Ruft auf  : eintext,eingabe,alrt,was_ist,lesen,do_list
  17914.   .| Aufruf in : alt-1,
  17915.   eintext("Suchstring:","")
  17916.   po%=@eingabe("Position",0)
  17917.   erg%=@alrt(1,"Mit Display?",1,"Ja|Nein")
  17918.   s$=a$
  17919.   buf$=STRING$(bps%,0)
  17920.   '
  17921.   DO
  17922.     BMOVE buf%,VARPTR(buf$),LEN(buf$)
  17923.     EXIT IF MID$(buf$,po%,LEN(s$))=s$
  17924.     EXIT IF @was_ist=1
  17925.     INC lgs%
  17926.     lesen
  17927.     IF erg%=1
  17928.       do_list
  17929.     ENDIF
  17930.   LOOP
  17931.   '
  17932.   do_list
  17933.   '
  17934.   '
  17935. RETURN
  17936. '
  17937. ' Noch nicht eingebaute Vorschlaege von Frank Rüger:
  17938. ' -------------------------------- Schnipp ---------------------------------
  17939. ' 10455d10459
  17940. ' <           IF la%<=wzb%
  17941. ' 10457,10459d10460
  17942. ' <           ELSE
  17943. ' <             pos_cursor(la%)
  17944. ' <           ENDIF
  17945. ' 10462d10462
  17946. ' <       pos_cursor(0)
  17947. ' -------------------------------- Schnapp ---------------------------------
  17948. ' Diese Änderungen in der PROC 'adresse' sollte sich Claus am besten mal
  17949. ' anschauen, da ich nicht genau weiß, was da alles passiert! Auf jeden Fall
  17950. ' funktioniert so die Positionierung per Eingabe einer Adresse besser
  17951. ' (Anklicken links im HEX-Fenster oder per Menü)! Vorher gab es
  17952. ' widersprüchliche Befehle und überflüssige Variablenzuweisungen! Totales
  17953. ' Chaos in dieser PROC;-) Ich weiß auch nicht, ob obige Änderungen korrekt
  17954. ' sind!
  17955. '
  17956. ' Kommentar CB: Die Prozedur ist mir auch noch etwas suspekt, daher
  17957. '               habe ich diese Änderung zurückgestellt, zumal sie
  17958. '               mir auch keinen konkreten Fehler zu beheben scheint.
  17959. ' -------------------------------- Schnipp ---------------------------------
  17960. ' 12220a12225
  17961. ' >   LOCAL klickcl%,anzcl%,f_out$
  17962. ' 12246c12251
  17963. ' <         out$(0)=@dec_hex_val$(cl%,6)+" "+f$+SPACE$(MAX(0,wc%-LEN(f$)))
  17964. ' ---
  17965. ' >         klickcl%=cl%
  17966. ' 12261a12267
  17967. ' >         anzcl%=1
  17968. ' 12269a12276
  17969. ' >               INC anzcl%
  17970. ' 12274a12282,12283
  17971. ' >         f_out$=@pfad_format$(f$,52)
  17972. ' >         out$(0)=@dec_hex_val$(klickcl%,6)+" "+f_out$+" ("+STR$(anzcl%)+"
  17973. ' Cluster)"+SPACE$(MAX(0,wc%-LEN(f_out$)-11-LEN(STR$(anzcl%))))
  17974. ' -------------------------------- Schnapp ---------------------------------
  17975. ' Beim Klicken in die graphische FAT-Übersicht, wird jetzt hinter dem
  17976. ' Datei-(oder Ordner-)namen auch die Anzahl der belegten Cluster in der
  17977. ' Infozeile angegzeigt!
  17978. '
  17979. ' diff -aC sed_565.lst sed_565d.lst >sed_diff.txt
  17980. '
  17981. ' -------------------------------- Schnipp ---------------------------------
  17982. ' *** 6236,6241 ****
  17983. ' --- 6236,6243 ----
  17984. '  RETURN
  17985. '  PROCEDURE wind_dklick
  17986. '    LOCAL a%,aa%,cl%,cz%
  17987. ' +   LOCAL alrt_text$,filename$,file_att|,file_startcl%
  17988. ' +   LOCAL file_len,tm%,tm$,dt%,dt$,pipe&,i&
  17989. '    '
  17990. '    change
  17991. '    IF mode%=d.isk%
  17992. ' ***************
  17993. ' *** 6253,6265 ****
  17994. '      ELSE
  17995. '        IF lgs%>len_fat%*2                ! woanders = DIR ?
  17996. '          a%=INT((z%+tz%)/32)*32
  17997. '          cl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26}
  17998. ' !         IF cl%>0
  17999. '            lgs%=(cl%-2)*spc%+len_fat%*2+len_dir%+1
  18000. '          ELSE
  18001. '            lgs%=anf_fat2%+len_fat%
  18002. '          ENDIF
  18003. '        ENDIF
  18004. '        lgs%=MIN(spd%-1,lgs%)
  18005. '      ENDIF
  18006. '      lesen
  18007. ' --- 6255,6313 ----
  18008. '      ELSE
  18009. '        IF lgs%>len_fat%*2                ! woanders = DIR ?
  18010. '          a%=INT((z%+tz%)/32)*32
  18011. ' +         IF hex!
  18012. ' +           file_startcl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26}
  18013. ' +           IF file_startcl%<cpd%
  18014. ' +             filename$=STRING$(11,32)
  18015. ' +             BMOVE buf%+a%,V:filename$,11
  18016. ' +             filename$=@nam_conv$(filename$,0)
  18017. ' +             pipe&=INSTR(filename$,"|")
  18018. ' +             WHILE pipe&
  18019. ' +               MID$(filename$,pipe&,1)="!"
  18020. ' +               pipe&=INSTR(filename$,"|")
  18021. ' +             WEND
  18022. ' +             alrt_text$="Dateiname: "+filename$
  18023. ' +             '
  18024. ' +             file_att|=BYTE{buf%+a%+11}
  18025. ' +             alrt_text$=alrt_text$+"|Dateiattribute: %"+BIN$(file_att|,6)+" =
  18026. ' "
  18027. ' +             FOR i&=5 DOWNTO 0
  18028. ' +               IF BTST(file_att|,i&)
  18029. ' +                 alrt_text$=alrt_text$+MID$("RHSLDA",SUCC(i&),1)
  18030. ' +               ELSE
  18031. ' +                 alrt_text$=alrt_text$+"_"
  18032. ' +               ENDIF
  18033. ' +             NEXT i&
  18034. ' +             '
  18035. ' +             tm%=BYTE{buf%+a%+23}*256+BYTE{buf%+a%+22}
  18036. ' +             dt%=BYTE{buf%+a%+25}*256+BYTE{buf%+a%+24}
  18037. ' +             tm$=RIGHT$("0"+STR$((tm% DIV 2048) AND 31),2)
  18038. ' +             tm$=tm$+":"+RIGHT$("0"+STR$((tm% DIV 32) AND 63),2)
  18039. ' +             tm$=tm$+":"+RIGHT$("0"+STR$(2*(tm% AND 31)),2)
  18040. ' +             dt$=RIGHT$("0"+STR$(dt% AND 31),2)
  18041. ' +             dt$=dt$+"."+RIGHT$("0"+STR$((dt% DIV 32) AND 15),2)
  18042. ' +             dt$=dt$+"."+STR$(1980+((dt% DIV 512) AND 63))
  18043. ' +             alrt_text$=alrt_text$+"|Uhrzeit/Datum: "+tm$+"/"+dt$
  18044. ' +             '
  18045. ' +             alrt_text$=alrt_text$+"|Startcluster: "+STR$(file_startcl%)
  18046. ' +             '
  18047. ' +
  18048. ' file_len=BYTE{buf%+a%+28}+BYTE{buf%+a%+29}*&H100+BYTE{buf%+a%+30}*&H10000+BYTE{
  18049. ' buf%+a%+31}*&H1000000
  18050. ' +             alrt_text$=alrt_text$+"|Dateilänge: "+STR$(file_len)
  18051. ' +             '
  18052. ' +             ~@alrt(1,alrt_text$,1," OK ")
  18053. ' +           ENDIF
  18054. ' +         ELSE
  18055. '            cl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26}
  18056. ' !           IF cl%<cpd%
  18057. '              lgs%=(cl%-2)*spc%+len_fat%*2+len_dir%+1
  18058. ' +             CLR z%
  18059. '            ELSE
  18060. ' +             IF @alrt(1,"Cluster Nr. "+STR$(cl%)+"|existiert
  18061. ' nicht!",1,"Root-Dir|Abbruch")=1
  18062. '                lgs%=anf_fat2%+len_fat%
  18063. ' +               CLR z%
  18064. ' +             ENDIF
  18065. '            ENDIF
  18066. '          ENDIF
  18067. ' +       ENDIF
  18068. '        lgs%=MIN(spd%-1,lgs%)
  18069. '      ENDIF
  18070. '      lesen
  18071. ' -------------------------------- Schnapp ---------------------------------
  18072. ' Das ist jetzt kein Bugfix, sondern ein neues Feature! Habe ich bei mir
  18073. ' eingebaut, vielleicht kann ja jemand was damit anfangen! Wenn man im
  18074. ' Datenfenster im Hex-Bereich (links) doppelklickt (vorzugsweise in
  18075. ' Directories), werden die Daten Filename, Attribute, Datum, Uhrzeit,
  18076. ' Startcluster und Länge im Klartext in einer Alertbox angezeigt! Dabei
  18077. ' werden Pipes "|" in "!" gewandelt, da Pipes schon als Zeilentrenner in
  18078. ' der Alertbox dienen! Aber normalerweise kommen auch keine Pipes in
  18079. ' Dateinamen vor, ist auch nur für den Fall, wenn jemand im Datenbereich in
  18080. ' einen Cluster doppelklickt, der kein Directory enthält!
  18081. '
  18082. ' Außerdem wird bei Doppelklick in den ASCII-Bereich des Datenfensters
  18083. ' (rechts) überprüft, ob der Startcluster des Files (wenn es denn ein
  18084. ' Directory sein sollte) überhaupt existiert und man kann in einer Alertbox
  18085. ' wählen, ob das Root-Directory anzeigt werden soll oder gar nichts
  18086. ' passiert!
  18087. '
  18088. ' Kommentar CB: Keine schlechte Idee, aber dazu sollte es einen eigenen
  18089. '               Dialog und kein Alert-Gepfriemel geben. Dazu bin ich aber
  18090. '               noch nicht gekommen.
  18091. '
  18092. '
  18093. ' -------------------------------- Schnipp ---------------------------------
  18094. ' *** 9565,9576 ****
  18095. '  RETURN
  18096. '  PROCEDURE alt_q               ! Komplett suchen
  18097. '    LOCAL first!
  18098. '    first!=TRUE
  18099. '    erg%=3
  18100. '    clr_out("")
  18101. '    DO
  18102. '      search
  18103. ' !     EXIT IF (no_nxt%=1 AND found!=FALSE) OR abb% OR search$=""
  18104. '      info_line
  18105. '      set_slide(whdl&(0))
  18106. '      IF first!=TRUE
  18107. ' --- 9614,9628 ----
  18108. '  RETURN
  18109. '  PROCEDURE alt_q               ! Komplett suchen
  18110. '    LOCAL first!
  18111. ' +   IF wind%=1
  18112. ' +     nur_daten_fenster
  18113. ' +   ELSE
  18114. '      first!=TRUE
  18115. '      erg%=3
  18116. '      clr_out("")
  18117. '      DO
  18118. '        search
  18119. ' !       EXIT IF no_nxt%=1 OR abb% OR search$=""
  18120. '        info_line
  18121. '        set_slide(whdl&(0))
  18122. '        IF first!=TRUE
  18123. ' *** 9593,9598 ****
  18124. ' --- 9645,9651 ----
  18125. '      CLR search_cont%
  18126. '      lesen
  18127. '      out_do
  18128. ' +   ENDIF
  18129. '  RETURN
  18130. '  PROCEDURE alt_t               ! Block ins ASCII-Fenster
  18131. '    LOCAL ab%,a%,b%,c%,b$
  18132. ' -------------------------------- Schnapp ---------------------------------
  18133. ' "Komplett suchen  Alt-Q" jetzt nur noch im Datenfenster, da es, zumindest
  18134. ' bei mir, im Textfenster nicht funktionierte (Absturz)! Das Ergebnis der
  18135. ' Suche wird ja ebenfalls im Textfenster ausgegeben! Vielleicht gab es da
  18136. ' Überschneidungen im Text-Array? Außerdem habe ich die Abbruchbedingung
  18137. ' etwas verändert, da sonst in einer Endlosschleife immer wieder von vorne
  18138. ' gesucht wurde!
  18139. '
  18140. ' Kommentar CB: Bevor man das Suchen im Textfenster abklemmt, sollte
  18141. '               man versuchen, den eigentlichen Grund für den Fehler
  18142. '               zu finden.
  18143.